У меня есть таблица с именем 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), мне нужно, чтобы он возвращал строку с id 3. Поскольку нет гарантии, что sort_order будет непрерывным, я не могу просто выбрать known_sort_order + 1.
Спасибо!


Это кажется слишком простым, но похоже на то, что вам нужно:
SELECT id,question FROM `questions`
WHERE `sort_order` > sort_order_variable
ORDER BY sort_order ASC
LIMIT 1
ASC, так как он хочет следующую самую низкую запись
Упс, я увидел ID = 3 и подумал, что он имел в виду sort_order = 3. Вы поняли: D
И нет причин заключать в кавычки переменную порядка сортировки, если это целое число (и это может помешать оптимизатору).
<так как он хочет следующий самый низкий (3 <5)
Это будут мешает оптимизатору, по моему личному опыту.
@Eran: ему нужна строка с sort_order = 8, а не 3.
Вы правы ... он перепутал меня с нумерацией id в своем вопросе. Фиксированный
Если в таблице много записей с sort_order > sort_order_variable, будет ли это медленно? Я предполагаю, что нам придется каждый раз сортировать все эти строки.
Вы можете сделать это с помощью 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
«TOP N» - нестандартная функция Microsoft / Sybase. MySQL не поддерживает это.
Правильно, поэтому я поставил LIMIT (так как заголовок я не заметил, единственное место, где был идентифицирован MySQL.) :) Является ли LIMIT стандартом SQL?
Нет, LIMIT - это нестандартный SQL. Насколько мне известно, поддерживается только MySQL / PostgreSQL / SQLite.
Вот что я подумал - любое ограничение на количество записей нестандартно (я полагаю, что Кодд и Дейт оценили бы это). Так что мое «переносимое» утверждение в порядке. :)
SELECT
id, question, sort_order
FROM faq_questions
WHERE sort_order in
(SELECT
MIN(sort_order)
FROM faq_questions
WHERE sort_order > ?);
Кажется, это работает
Да, это работает. Вы также можете использовать = вместо IN, поскольку подзапрос возвращает одно значение.
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1
Обязательно ORDER BY sort_order DESC, иначе вы получите странные результаты