Есть таблица с полями: id INT, name VARCHAR(255), date DATE.
Как можно сформировать SELECT запрос с сортировкой по полю date так, чтобы записи начинались с фиксированного значения id?
Поясню.
вся таблица сортируется по дате, при этом id могут идти как угодно, к примеру так: 10, 20, 3, 40, 15, 1, 17. Мне нужно запросом получать пачки строк с к-вом (LIMIT 10 к примеру), но чтобы каждая пачка начиналась с определенного id. Например нужно с id=40, тогда будет последовательность: 40, 15, 1, 17 и т.д.
Есть еще один вариант, учитывающий неуникальность поля date
select t.id, t.name, t.`date` from
(
select @rownum := @rownum + case when tbl.id = 40 then 100000 else 1 end row_num, tbl.* from tbl
inner join (SELECT @rownum := 0) r
order by tbl.`date`
) t
where row_num > 100000
Для правильного вопроса надо знать половину ответа
Для первого запроса:
SELECT `id`, `date`, `name`
FROM `table`
ORDER by `date`, `id`
LIMIT 10
`id` последней строки сохраняем в last_id. Для следующего запроса:
SELECT `id`, `name`, `date`
FROM `table`
WHERE (@Date := (SELECT `date` FROM `table` WHERE `id` = :last_id))
AND (`date` > @Date OR (`date` = @Date AND `id` > :last_id))
ORDER BY `date`, `id`
LIMIT 10
Работать то будет, но не так как мне нужно. При сортировке по дате, id могут идти как угодно уже писал. К примеру так: 10, 20, 3, 40, 15, 1, 17. И мне к примеру нужно чтобы первая запись в выдаче была с id=40. Тогда неверно указывать в WHERE id >= 40, т.к. после 40 не обязательно идут id больше этого значения
Sergey Romanov: вся таблица сортируется по дате, при этом id могут идти как угодно, к примеру так: 10, 20, 3, 40, 15, 1, 17. Мне нужно запросом получать пачки строк с к-вом (LIMIT 10 к примеру), но чтобы каждая пачка начиналась с определенного id. Например нужно с id=40, тогда будет последовательность: 40, 15, 1, 17 и т.д.
Александр Васюченко: Надо рассматривать проблему в комплексе, потому как если этот клиент - десктопное приложение с наличием постоянного соединения с базой, можно просто догружать нужные строки по мере необходимости из одного запроса, в котором есть только сортировка, без отрезания ID
Если клиент - двухзвенное приложение, так или иначе понадобится сначала данные отобрать, потом в сортированном виде передавать. Это можно сделать хранимой процедурой (которая выполнит отбор) и запросом ее результата с сортировкой.
Второй вариант состоит в том, чтобы отбирать данные базой, а сортировать на клиенте.
Можно попробовать сделать с подзапросом, который будет выбирать по дате, а основной запрос отфильтрует id
Но что-то мне подсказывает, что у вас изначально что-то не то с архитектурой
> Можно попробовать сделать с подзапросом, который будет выбирать по дате, а основной запрос отфильтрует id
Можно пример? (я не особо крутой спец по SQL)
> Но что-то мне подсказывает, что у вас изначально что-то не то с архитектурой
Возможно так кажется. Вся таблица должна быть отсортирована по дате. А в запросах я должен получать некие пачки строк с начальным id и ограниченным к-вом (LIMIT 10 к примеру)
Наверно изначально непонятно объяснил, но сортировка по дате играет ключевую роль для меня.
Копирую описание еще:
вся таблица сортируется по дате, при этом id могут идти как угодно, к примеру так: 10, 20, 3, 40, 15, 1, 17. Мне нужно запросом получать пачки строк с к-вом (LIMIT 10 к примеру), но чтобы каждая пачка начиналась с определенного id. Например нужно с id=40, тогда будет последовательность: 40, 15, 1, 17 и т.д.
Sergey Romanov: все просто. Если вся последовательность: 10, 20, 3, 40, 15, 1, 17, 5, 7, 50, 67, 32
то первая пачка из 5-ти строк будет: 10, 20, 3, 40, 15
второму запросу я передаю последний id из первой пачки (id=15) и этот запрос выдает следующую после id=15: 1, 17, 5, 7, 50
А зачем вы передаете что то? Не понятно. Можно же просто лимитом пользоваться.
Как вы определяете что в 10, 20, 3, 40, 15 именно 40 должен быть первым? Какой будет первым в группе 1, 17, 5, 7, 50 и почему? Что если 40 это дата самая меншая и нарушает сортировку по дате?
Я думаю вам надо объяснить что вы делаете. Что это за записи, и что вы хотите завершить.