2010-02-01 7 views
18

J'ai une requête comme ceci: SELECT * FROM table WHERE id IN (2,4,1,5,3);mysql tri personnalisé

Cependant, quand je l'imprime, il est automatiquement triés 1,2,3,4,5. Comment pouvons-nous maintenir la commande (2,4,1,5,3) sans changer la structure de la base de données?

Merci!

Répondre

20

je demande ceci:

mysql order by issue

les réponses que je reçois et tout le crédit appartiennent à eux est:

Vous pouvez utiliser un opérateur CASE pour spécifier l'ordre:

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 

en php vous pouvez le faire comme:

<?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; 

?> 
+6

La solution de Lucas Rossini Ferreira est beaucoup plus simple. – mkataja

+0

oui vous avez raison –

2

La commande par domaine n'a jamais travaillé pour moi. J'ai eu une liste de pays et je avais besoin États-Unis et le Canada apparaît en haut de la liste, de sorte que ma requête était comme ça:

SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC 

Cela n'a jamais travaillé, mais je me suis aperçu que l'ordre était différent, il était montrant le Canada et les États à la fin de la liste, alors j'ai fait ceci:

SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC 

Et ça a marché ... pourquoi? Beats me, mais il a juste fait; essayez-le aussi.

5

(j'aurais écrit cela comme un commentaire sur la réponse de Michel Tobon, mais ne pas la réputation, désolé :-)

« Et ça a marché ... pourquoi? Me Beats, mais ça fait Essayez-le aussi. "

La raison qui fonctionne est parce que votre expression "code! = 'USA'" produit un résultat booléen, qui en SQL est représenté par 1 ou 0. Donc, l'expression "code = 'USA' produit 1 Étant donné que 1 est supérieur à 0 dans un tri ascendant (valeur par défaut), les enregistrements correspondants seront triés plus tard que les enregistrements non concordants, annulant ainsi cette expression pour produire l'effet inverse. .

une autre façon (peut-être plus clair) de produire le même résultat serait la suivante:

SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC 

Bien sûr, dans un en changeant la question de l'OP, j'aime l'option FIELD() mieux - assez propre :-)

+0

Expliqué très bien. – ChristianLinnell

+0

Merci :-) (J'ai assez de réputation pour commenter maintenant! :-D) – opensourcejunkie