我有一个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的记录。预期的结果是应该获取来自ample的所有记录。如果我使用DATE
上的Order by条件执行相同的查询ORDER BY DATE ASC
,我会得到所需的结果。
是在每次获取中我们得到一个新的结果集,应用了哪个顺序?
答案 0 :(得分:2)
问题是&#34; LIMIT 4,2&#34;和&#34;限制2,2&#34;,这意味着你不想要所有的结果
要解释更多:
LIMIT 4,2表示从第4个开始只需要2个结果
来自MYSQL网站limit optimization
的LIMIT和ORDER优化的最佳解释答案 1 :(得分:1)
您使用了远程查询日期,您的ID是主键。您将根据“增加日期和时间顺序”获得输出。
因此,如果没有使用限制,订单将按此顺序
Id
4
2
1
5
3
查询1的限制2 - &gt;你会得到ID's 4 and 2
查询2-的限制为2,2&gt;这里您的偏移量为2,因此它将跳过前两个结果ie.(4 and 2)
,它将打印ID's 1 and 5
对于查询3 - &gt;尝试限制4,1您将获得Id 3