SELECT MySQL sütuna bir dizi ekleme

2 Cevap php

Ben de kullanıcılar ve kendi karma seti ile bir dizi var:

$some_array = Array
(
    [user_id] => Array
        (
            [0] => 4
            [1] => 3
            [2] => 5
            [3] => 1
        )

    [karma] => Array
        (
            [0] => 129
            [1] => 87
            [2] => 13
            [3] => 20
        )

)

Eğer MySQL tablodan kullanıcı verileri almak zaman, o extra_column tarafından karma dizi ve sipariş ile ekstra bir sütun ekleyebilirsiniz, merak ediyordum:

 $query = 'SELECT user.*, {{$some_array['karma'] as extra_column}} WHERE
 user.id IN '.(implode(',',$some_array['user_id'])).' ORDER BY extra_column';

Herhangi bir fikir? Bu mümkün mü?

2 Cevap

Gerçekten (en azından bazı gerçekten kötü dinamik sql nesil geçmeden).

Siz kullanıcı tablo üzerinde bir sütun (veya kullanıcı tabloya katılabilecek bazı diğer tablodaki) de karmaya sahip olması gerekir. Bu zaten doğru olsa veritabanında saklanmalıdır gibi görünüyor?

Dizideki değerler komut dosyası tarafından sağlanacak varsa (yani, ideal bir durumda olan, onlara katılmak olabilir herhangi bir şekilde veritabanında bulunmayan), sonra iki olasılık görüyorum:

  1. Karmanızın için geçici bir tablo oluşturmak, tüm karma değerler eklemek, ve sonra karma dizi ile sorgu katılmak
  2. Sorgunuzda bir case ifadesi kullanın. Kullanıcılarının sayısı büyükse, bu savunulamaz bir çözümdür.

Case deyimini oluşturmak için kod şöyle bir şey olabilir:

$query = 'SELECT *, ' . GenerateCaseStatement($some_array) . ' AS extra_column FROM user WHERE user.id in (' . implode(',', $some_array['user_id']) . ' ORDER BY extra_column';

function GenerateCaseStatement($some_array)
{
    $str = 'CASE id ';
    for (i=0; i<array_len($some_array['user_id']); ++i)
    {
        $str .= ' WHEN ' . (int)($some_array['user_id'][i]) . ' THEN ' . (int)($some_array['karma'][i]);
    }
    $str .= ' ELSE NULL END';
    return $str;
}