2008-12-11 8 views
9

J'ai une table, appelée faq_questions avec la structure suivante:MySql requête, sélectionnez supérieure à

id int not_null auto_increment, 
question varchar(255), 
sort_order int 

Je tente de construire une requête qui donne un ordre de tri, sélectionne la ligne suivante à la ordre de tri le plus élevé.

Exemple:

id question    sort_order 
1 'This is question 1' 10 
2 'This is question 2' 9 
3 'This is another'  8 
4 'This is another one' 5 
5 'This is yet another' 4 

Ok, alors imaginez que je passe à 5 pour mon ordre de tri connu (id 4), j'ai besoin de retourner la ligne avec identifiant 3. Comme il n'y a aucune garantie que SORT_ORDER sera contiguë Je ne peux pas simplement sélectionner known_sort_order + 1.

Merci!

Répondre

21

Il semble trop simple, mais il ressemble à ce que vous avez besoin:

SELECT id,question FROM `questions` 
WHERE `sort_order` > sort_order_variable 
ORDER BY sort_order ASC 
LIMIT 1 
+0

Assurez-vous de COMMANDER PAR sort_order DESC sinon vous obtiendrez des résultats étranges –

+1

ASC, car il veut la prochaine entrée le plus bas –

+0

Whoops, j'ai vu ID = 3 et je pensais qu'il voulait dire sort_order = 3 . Vous l'avez: D –

2

Vous pouvez le faire avec TOP ou LIMIT:

SELECT TOP 1 * FROM faq_questions 
WHERE sort_order > 5 
ORDER BY sort_order ASC 

mais ce n'est pas aussi élégant ou portable

SELECT * 
FROM faq_questions AS f1 
LEFT JOIN faq_questions AS f2 
    ON f1.sort_order > f2.sort_order 
    AND f2.sort_order = 5 
LEFT JOIN faq_questions AS f3 
    ON f3.sort_order BETWEEN f1.sort_order AND f2.sort_order 
WHERE f3.id IS NULL 
+0

"TOP N" est une fonctionnalité non standard de Microsoft/Sybase. MySQL ne le supporte pas. –

+0

A droite, c'est pourquoi j'ai mis LIMIT (puisque je n'ai pas remarqué le titre, le seul endroit où MySQL a été identifié.) :) LIMIT est-il un standard SQL? – dkretz

+0

Non, LIMIT est un SQL non standard. Pour autant que je sache, il n'est supporté que par MySQL/PostgreSQL/SQLite. –

0
SELECT 
    id, question, sort_order 
FROM faq_questions 
WHERE sort_order in 
(SELECT 
     MIN(sort_order) 
    FROM faq_questions 
    WHERE sort_order > ?); 

Cela semble fonctionner

+0

Oui, ça marche. Vous pouvez également utiliser = au lieu de IN, car la sous-requête renvoie une seule valeur. –

+0

Merci, mon cerveau semble être brisé aujourd'hui, haha –

3
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1