sorundan mysql sipariş

4 Cevap php

i gibi bir sorgu varsa

SELECT * FROM table  WHERE id IN (3,6,1,8,9);

this array of the ids is build in php dynamically , and the order is important to me.

$my_array =  array (3,6,1,8,9) ;

nasıl ben elemanları benim dizi görünür hangi sıraya göre sıralayabilirsiniz?

its possible to do it in MYSQL query, or i must to order it after via php ?

4 Cevap

Bir sütunda türetilmiş bir değeri tarafından sipariş edebilirsiniz. Sen sırasını belirlemek için bir CASE operatörünü kullanabilirsiniz:

SELECT * FROM table
WHERE id IN (3,6,1,8,9)
ORDER BY CASE id WHEN 3 THEN 1
                 WHEN 6 THEN 2
                 WHEN 1 THEN 3
                 WHEN 8 THEN 4
                 WHEN 9 THEN 5
         END

Eğer bunu bu şekilde yapmak zorunda iseniz PHP verileri işlemek gerekir. MySQL doğal sıralamaların sadece sipariş artan veya azalan yapabilirsiniz.

Soru olsa gerek - neden veriler, bu çok özel amacıyla iade gerekiyor? Ayrıca kod kadar şey yeniden jig tarafından soruna kolay bir çözüm olabilir.

Ben test etmedim ama bu PHP çözüm çalışması gerekir:

<?php

$my_array =  array (3,6,1,8,9) ;

$sql = 'SELECT * FROM table  WHERE id IN (3,6,1,8,9)';

$sql .= "\nORDER BY CASE id\n";
foreach($my_array as $k => $v){
    $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n";
}
$sql .= 'END ';

echo $sql;

?>

Bu aşağıdaki SQL kodu oluşturur:

SELECT * FROM table  WHERE id IN (3,6,1,8,9)
ORDER BY CASE id
WHEN 3 THEN 0
WHEN 6 THEN 1
WHEN 1 THEN 2
WHEN 8 THEN 3
WHEN 9 THEN 4
END

Sen endeksleri gibi kimlikleri ile bir diziye sonuçları yükleyebilirsiniz:

 while ($row = mysql_fetch_array($l)) $items[$row['id']] = $row;

ve sonra sadece düzen içinde yineleme

 foreach ($my_array as $id) { $current_row = $items[$id]; ... }