У меня есть таблица MySQL MyISAM, структура которой приведена ниже.
CREATE TABLE 'VIEW_LOG_TRIGGER_TEMP' (
'ID' mediumint(9) NOT NULL AUTO_INCREMENT,
'VIEWER' int(10) unsigned NOT NULL DEFAULT '0',
'VIEWED' int(10) unsigned NOT NULL DEFAULT '0',
'DATE' datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
'SEEN' char(1) NOT NULL,
PRIMARY KEY ('ID'),
UNIQUE KEY 'VIEWED' ('VIEWED','VIEWER'),
KEY 'VIEWER' ('VIEWER'),
KEY 'DATE' ('DATE')
) ENGINE=MyISAM
Содержимое таблицы выглядит следующим образом:
Я хочу получить записи между двумя датами, и в каждом наборе результатов я хочу две записи. Выполнение следующих запросов, набор результатов которых показан на прилагаемом изображении:
SELECT * FROM test.VIEW_LOG_TRIGGER_TEMP WHERE DATE >= '2018-02-11 00:00:00' AND DATE < '2018-02-12 00:00:00' LIMIT 2;
SELECT * FROM test.VIEW_LOG_TRIGGER_TEMP WHERE DATE >= '2018-02-11 00:00:00' AND DATE < '2018-02-12 00:00:00' LIMIT 2,2;
SELECT * FROM test.VIEW_LOG_TRIGGER_TEMP WHERE DATE >= '2018-02-11 00:00:00' AND DATE < '2018-02-12 00:00:00' LIMIT 4,2;
Поскольку мы видим, что запись с ID 3 не извлекается. Ожидаемый результат - все записи из массива должны быть извлечены. Если я выполняю те же запросы с условием Order by по DATE
как ORDER BY DATE ASC
, я получаю требуемый результат. В каждой выборке мы получаем новый результирующий набор, на котором применяется порядок?
Проблема заключается в "LIMIT 4,2" и "LIMIT 2,2", это означает, что вы не хотите, чтобы все результаты
Чтобы объяснить больше:
LIMIT 4,2 означает, что вам нужно всего 2 результата, начиная с 4-го
И лучшее объяснение оптимизации LIMIT и ORDER с оптимизацией лимита сайта MYSQL
Вы использовали ranged Query for Date, а ваш ID - первичный ключ. Вы получите результат, основанный на увеличении даты и времени.
Таким образом, заказ будет в указанном порядке, если не используется ограничение
Id
4
2
1
5
3
Предел 2 для запроса 1 → вы получите ID 4 and 2
Предел 2,2 для запроса 2-> Здесь ваше смещение равно 2, поэтому он пропустит первые два результата, ie.(4 and 2)
Е. ie.(4 and 2)
и он напечатает ID 1 and 5
Для запроса 3 → Try Limit 4,1 вы получите Id 3