2008-12-11 16 views
9

Mam tabelę, zwany faq_questions o następującej strukturze:MySQL Query, wybierz większy niż

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

Ja próbuje zbudować kwerendę, która otrzymuje porządek, wybiera następny wiersz z najwyższa kolejność sortowania.

Przykład:

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, więc sobie wyobrazić, mijam w 5 dla mojego znanej kolejności sortowania (id 4), muszę go do powrotu wiersz z id 3. Ponieważ nie ma gwarancji, że porządek_sortowania będzie sąsiadujące Nie mogę po prostu wybrać znanego_sort_order + 1.

Dzięki!

Odpowiedz

21

To wydaje się zbyt proste, ale wygląda na to, czego potrzebujesz:

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

Koniecznie Zamów przez porządek_sortowania DESC inaczej dostaniesz dziwne rezultaty –

+1

ASC, ponieważ chce kolejnej najniższej –

+0

Ups, widziałem id = 3 i myślał, że rozumie porządek_sortowania = 3 . Masz to: D –

2

Można to zrobić z TOP lub LIMIT:

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

ale to nie jest tak elegancki i przenośny jako

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" to niestandardowa funkcja Microsoft/Sybase. MySQL go nie obsługuje. –

+0

Właśnie dlatego ustawiłem LIMIT (ponieważ nie zauważyłem tytułu, jedynego miejsca, gdzie zidentyfikowano MySQL.) :) Czy LIMIT jest standardem SQL? – dkretz

+0

Nie, LIMIT jest niestandardowym językiem SQL. O ile mi wiadomo, jest obsługiwany tylko przez 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 > ?); 

To wydaje się działać

+0

Tak, to działa. Możesz także użyć = zamiast IN, ponieważ podzapytanie zwraca pojedynczą wartość. –

+0

Dzięki, mój mózg wydaje się być złamany dzisiaj, haha –

3
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1 
Powiązane problemy