2010-03-02 4 views
2

Je souhaite récupérer un résultat de requête ordonné, mais j'ai besoin de lignes spécifiques devant la liste. Quelque chose comme ici sur Stack Overflow, dans la liste des réponses, la bonne réponse est toujours la première.ORDER BY condition

supposais que je dois avoir les lignes avec des ID 1,2,3 à la tête, le reste trié par un champ de date, est-il possible de faire quelque chose comme:

SELECT * FROM foo ORDER BY id IN (1,2,3), created_date 

Si pas ce qui est plus efficace? Il y aura beaucoup de rangées!

SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3) 
UNION 
SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3) 
ORDER BY head, created_date 

ou

SELECT *, IF(id IN (1,2,3), 0, 1) AS head 
ORDER BY head, created_date 

(je l'utilise MySQL, mais je suis intéressé par toute autre solution SQL.)

Répondre

2

Votre premier exemple me semble presque là.

SELECT * FROM foo ORDER BY id IN (1,2,3) DESC, created_date ASC 

Ajouté DESC parce que id IN (1,2,3) retours 1 si cela est vrai ou faux. 0 si 1 > 0, donc les commander dans l'ordre décroissant obtient le résultat désiré.

Ajouté ASC parce que j'aime être explicite. En fonction de vos exemples ultérieurs, je pense que ce qui vous manque est que, bien qu'il contienne des espaces, field IN (list) est un opérateur unique qui renvoie 0 ou 1. IF(id IN (1,2,3), 0, 1) est intrinsèquement redondant.

En tant que tel, vous ne devriez pas avoir besoin d'utiliser une sorte UNIONou manuellement, depuis MySQL rend ce plus simple que vous réalisez même :)

+0

Je pensais que je dois avoir un nom de domaine et seulement un nom de domaine comme un argument ORDER BY, moi endormi – sibidiba

3

UNION signifie UNION DISTINCT et c'est relativement lent car il vérifiera pour les doublons même s'il n'y en aura pas. Vous voulez UNION ALL:

SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3) 
UNION ALL 
SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3) 
ORDER BY head, created_date 

J'imagine qu'après ce changement il n'y a pas beaucoup de différence de performance entre les trois requêtes. La meilleure façon d'être sûr est de le mesurer.