我们遇到了一个SELECT针对MySQL数据库(InnoDB)的查询的奇怪问题.
以下查询错误地返回1个匹配的记录:
select `ID`
from `AccessTables`
where `numTableID` = 14
AND `numUserCatID` IN (7,253)
AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2)
order by `ID` asc
limit 1
Run Code Online (Sandbox Code Playgroud)
而以下查询正确返回没有匹配的记录:
select `ID`
from `AccessTables`
where `numTableID` = 14
AND `numUserCatID` IN (7,253)
AND (`numUpdateCat` = 2 OR `numUpdateItems` = 2)
limit 1
Run Code Online (Sandbox Code Playgroud)
如您所见,这些查询之间的唯一区别是"order by"子句.
ID查询中请求的列是表的自动生成的主键列.
第一个查询中返回的记录是一个记录,如果'或'子句周围没有括号,则会找到该记录.但是在查询的那一部分周围有括号,所以我不明白为什么在这里返回此记录.然后,只有在查询中存在"order by"子句时.
正在使用的MySQL版本是:MySQL服务器:5.5.32-MariaDB-log
这里的任何人都可以对这个问题有所了解吗?提前致谢.
(编辑:省略括号确实会返回一行,但这是第一行查询返回的行)
insert into `AccessTables`(`ID`,`numUserCatID`,`numTableID`,`numUpdateCat`,`numPublishCat`,`numUpdateItems`,`dateInsert`,`dateUpdate`,`numInsertAuthorID`,`numUpdateAuthorID`,`numViewItems`) values (71,15,14,0,0,2,'2008-03-13 23:38:47','2013-04-04 09:34:36',0,513,2);
Run Code Online (Sandbox Code Playgroud)
(编辑nr.2:没有MariaDB,但.... http://sqlfiddle.com/#!2/2a922/8)
编辑nr.3,针对真正的MariaDB运行这些查询:
查询1:
EXPLAIN EXTENDED SELECT `ID`
FROM `AccessTables` …Run Code Online (Sandbox Code Playgroud)