2011-01-14 5 views
2

j'ai une instruction SQL:instruction select SQL

SELECT * 
    FROM users 
WHERE username = 'bbb' 
    OR username = 'aaa' 
    OR username = 'ddd' 
    OR username = 'ccc' 

Dans le tableau ddd a le plus grand id que ccc que bbb que aaa.

Maintenant, quand il renvoie les résultats, il les trie toujours par l'id comme: aaa, bbb, ccc, ddd. Mais je veux qu'ils restent dans le même ordre que je les ai entrés comme: bbb, aaa, ddd, ccc.

Quelqu'un peut-il m'aider avec une solution?

Répondre

7

En SQL, l'ordre de récupération n'est pas spécifié sauf si vous le demandez avec ORDER BY. Si vous souhaitez conserver la commande que vous avez saisie, ajoutez une colonne progressive ROW_NUMBER et demandez un tri.

+0

Certaines bases de données ont des classements par défaut sur lesquels vous ne devez pas compter, mais qui sont néanmoins présents. Par exemple, une table MySQL InnoDB renverra les résultats ordonnés par l'ascendant 'PRIMARY KEY' par défaut. – dkarp

4
select * from users where username='bbb' 
UNION 
select * from users where username='aaa' 
UNION 
select * from users where username='ddd' 
UNION 
select * from users where username='ccc' 

Malgré le fait que cette requête peut réaliser ce que vous souhaitez, en tant qu'utilisateur 6502 a déclaré, l'ordre est encore non précisée dans cette requête, et donc vous ne pouvez pas dépendre en toute sécurité à retourner en tant que telle dans les différents implémentations.

Comme une autre note de côté, si votre étrange ordre de tri n'a pas d'importance, vous devez simplement utiliser WHERE clause IN:

select * from users where username in ('aaa', 'bbb', 'ccc', 'ddd', 'ccc') 
+0

lol Juste parce que vous * pouvez * ne signifie pas que vous devriez: D –

+0

Oui, je suis d'accord que c'est une perversion curieuse. –

+0

je reçois "Le type de données de texte ne peut pas être sélectionné comme DISTINCT car il n'est pas comparable." si j'utilise union – hhh3112

1

Si vous avez une colonne "id" dans la table des utilisateurs (avec ddd ayant le « plus grand id »), alors vous pouvez faire quelque chose comme ceci:

select * from users where username in ('aaa','bbb','ccc','ddd') 
order by id; 

ETA: Si la colonne id est dans une autre table, vous aurez à effectuer une jointure pour obtenir les ids corrects .