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