小编Mar*_*jaR的帖子

选择查询和'order by'子句的MySQL问题

我们遇到了一个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)

mysql mariadb

5
推荐指数
1
解决办法
1452
查看次数

标签 统计

mariadb ×1

mysql ×1