SQL LIMIT совместно с оператором or

Подскажите пожалуйста как составить запрос, что бы 'вытащить' определённое количество строк. Делаю пагинацию. Есть переписка пользователя с пользователем, в базе таблица выглядит так id_from, id_to, text, date, flag.

Запросом

$sqlSelect = "SELECT id_from, id_to, text, date, flag FROM messages WHERE id_from = '$id_from' and id_to = '$id_to' OR id_from = '$id_to' and id_to = '$id_from' ";

я 'вытаскиваю' многомерный массив переписки пользователей и с этим все ок. Столкнулся с проблемой вывода при использовании оператора LIMIT, при установке значения LIMIT n, выводятся сообщения только одного пользователя, при установке значения LIMIT n, n, вообще происходит путаница. Я так понимаю что проблема в том что я использую оператор OR, и выбор идет до этого оператора, а если значений не хватает, то выбор продолжается после оператора. Как организовать запрос, что бы была 'корректная' лимитированная выдача сообщения, последовательно. Организовывал запрос в скобках, ничего не меняется.


Ответы (1 шт):

Автор решения: Герман Борисов

Akina как всегда отвечает правильно, но не оформляет ответом.

Поясню немного детальнее.

В стандарте SQL и документации всех известных мне серверов сказано, что при использовании LIMIT без ORDER BY результат не предсказуем, потому что порядок будет тот, что удобен серверу.

А при использовании OR в WHERE, при наличии индексов, серверу удобнее преобразовать запрос в следующий вид:

SELECT id_from, id_to, text, date, flag FROM messages
WHERE id_from = '$id_from' and id_to = '$id_to' -- Первая половина OR
UNION
SELECT id_from, id_to, text, date, flag FROM messages
WHERE id_from = '$id_to' and id_to = '$id_from' -- Вторая половина OR

то есть сначала все сообщения в одну сторону, потом в обратную

Так как в первой части достаточно данных, до второй мы не доходим.

Решение - фиксировать порядок записей явным указанием ORDER BY

→ Ссылка