MySql Query, выберите больше чем

У меня есть таблица faq_questions со следующей структурой:

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

Я пытаюсь создать запрос с заданным порядком сортировки, выбирая строку со следующим наивысшим порядком сортировки.

Пример:

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

Итак, представьте, что я передаю 5 для моего известного порядка сортировки (id 4), мне нужно, чтобы он возвращал строку с идентификатором 3. Поскольку нет гарантии, что sort_order будет смежным, я не могу просто выбрать known_sort_order + 1.

Спасибо!

11.12.2008 21:14:19
4 ОТВЕТА
РЕШЕНИЕ

Это кажется слишком простым, но выглядит так, как вам нужно:

SELECT id,question FROM `questions` 
WHERE `sort_order` > sort_order_variable
ORDER BY sort_order ASC 
LIMIT 1
24
11.12.2008 22:03:35
Обязательно ЗАКАЖИТЕ НА sort_order DESC, иначе вы получите странные результаты
Matt Rogish 11.12.2008 21:20:16
ASC, так как он хочет следующую самую низкую запись
Eran Galperin 11.12.2008 21:20:55
К сожалению, я увидел ID = 3 и подумал, что он имел в виду sort_order = 3. Вы получили это: D
Matt Rogish 11.12.2008 21:24:00
Это должно быть>, а не <.
Bill Karwin 11.12.2008 21:25:35
И нет никакой причины помещать кавычки вокруг переменной порядка сортировки, если она является целым числом (и это может помешать оптимизатору).
Bill Karwin 11.12.2008 21:26:36

Вы можете сделать это с помощью TOPили LIMIT:

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

но это не так элегантно или портативно, как

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
2
6.07.2013 10:08:51
«TOP N» - это нестандартная функция Microsoft / Sybase. MySQL не поддерживает это.
Bill Karwin 11.12.2008 21:21:39
Правильно, поэтому я поставил LIMIT (так как я не заметил заголовок, единственное место, где был идентифицирован MySQL.) :) Является ли LIMIT стандартом SQL?
dkretz 11.12.2008 21:25:52
Нет, LIMIT - это нестандартный SQL. Насколько я знаю, он поддерживается только MySQL / PostgreSQL / SQLite.
Bill Karwin 11.12.2008 21:27:32
Это то, что я подумал - любое ограничение на количество записей является нестандартным (я думаю, что Кодд и Дейт оценили бы это). Так что мое «переносимое» утверждение в порядке. :)
dkretz 11.12.2008 21:36:00
SELECT 
    id, question, sort_order
FROM faq_questions 
WHERE sort_order in 
(SELECT 
        MIN(sort_order) 
    FROM faq_questions 
    WHERE sort_order > ?);

Это похоже на работу

0
11.12.2008 21:20:20
Да, это работает. Вы также можете использовать = вместо IN, так как подзапрос возвращает одно значение.
Bill Karwin 11.12.2008 21:29:29
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1
3
11.12.2008 21:22:23