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

Спасибо!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
11
0
90 591
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Обязательно ORDER BY sort_order DESC, иначе вы получите странные результаты

Matt Rogish 12.12.2008 00:20

ASC, так как он хочет следующую самую низкую запись

Eran Galperin 12.12.2008 00:20

Упс, я увидел ID = 3 и подумал, что он имел в виду sort_order = 3. Вы поняли: D

Matt Rogish 12.12.2008 00:24

И нет причин заключать в кавычки переменную порядка сортировки, если это целое число (и это может помешать оптимизатору).

Bill Karwin 12.12.2008 00:26

<так как он хочет следующий самый низкий (3 <5)

Eran Galperin 12.12.2008 00:38

Это будут мешает оптимизатору, по моему личному опыту.

dkretz 12.12.2008 00:44

@Eran: ему нужна строка с sort_order = 8, а не 3.

Bill Karwin 12.12.2008 00:55

Вы правы ... он перепутал меня с нумерацией id в своем вопросе. Фиксированный

Eran Galperin 12.12.2008 01:04

Если в таблице много записей с sort_order > sort_order_variable, будет ли это медленно? Я предполагаю, что нам придется каждый раз сортировать все эти строки.

Konstantin Schubert 02.11.2012 23:44

Вы можете сделать это с помощью 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 не поддерживает это.

Bill Karwin 12.12.2008 00:21

Правильно, поэтому я поставил LIMIT (так как заголовок я не заметил, единственное место, где был идентифицирован MySQL.) :) Является ли LIMIT стандартом SQL?

dkretz 12.12.2008 00:25

Нет, LIMIT - это нестандартный SQL. Насколько мне известно, поддерживается только MySQL / PostgreSQL / SQLite.

Bill Karwin 12.12.2008 00:27

Вот что я подумал - любое ограничение на количество записей нестандартно (я полагаю, что Кодд и Дейт оценили бы это). Так что мое «переносимое» утверждение в порядке. :)

dkretz 12.12.2008 00:36
SELECT 
    id, question, sort_order
FROM faq_questions 
WHERE sort_order in 
(SELECT 
        MIN(sort_order) 
    FROM faq_questions 
    WHERE sort_order > ?);

Кажется, это работает

Да, это работает. Вы также можете использовать = вместо IN, поскольку подзапрос возвращает одно значение.

Bill Karwin 12.12.2008 00:29
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1

Другие вопросы по теме