SQL查询(AND& OR)混淆了

时间:2016-06-28 18:46:50

标签: mysql sql

帮助我理解为什么我会得到不同的COUNTS

查询1

SELECT Count(*) 
FROM   `foo` 
WHERE  `status_id` = 2 
       AND `updated_at` < Date(Now() - INTERVAL 1 day) 
       AND `number` LIKE 'A390%' 
        OR `number` LIKE 'A391%' 
        OR `number` LIKE 'A392%' 
  

results = 20000

查询2

SELECT Count(*) 
FROM   `foo` 
WHERE  `status_id` = 2 
       AND `updated_at` < Date(Now() - INTERVAL 1 day) 
       AND ( `number` LIKE 'A390%' 
              OR `number` LIKE 'A391%' 
              OR `number` LIKE 'A392%' ) 
  

results = 14967

SELECT Count(*) 
FROM   `foo` 
WHERE  `status_id` = 2 
       AND `updated_at` < Date(Now() - INTERVAL 1 day) 
       AND `number` LIKE X 

分别运行上述查询(A390,A391,A392)给我:

'A390%' = 0; 
'A391%' = 1496; 
'A392%' = 10000;

编辑: 添加屏幕截图以使其更清晰。我不得不做一些photoshop来改变表名

Query 1

Query 2

Query 3

Query 4

Query 5

2 个答案:

答案 0 :(得分:1)

http://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

您的第一个查询的条件相当于:

 (`status_id` = 2 
   AND `updated_at` < Date(Now() - INTERVAL 1 day) 
   AND `number` LIKE 'A390%'
 )
 OR `number` LIKE 'A391%' 
 OR `number` LIKE 'A392%'

答案 1 :(得分:0)

AND运算符的优先级高于OR,因此您的第一个查询等同于:

SELECT Count(*) 
FROM   `foo` 
WHERE
     (`status_id` = 2 
       AND `updated_at` < Date(Now() - INTERVAL 1 day) 
       AND `number` LIKE 'A390%') 
     OR `number` LIKE 'A391%' 
     OR `number` LIKE 'A392%' 

与您的第二个查询相比,status_idupdated_at上的条件仅适用于number LIKE 'A390%'的行。

如果对同一数据执行所有查询,则三个单独查询的总计数不能小于第二个查询返回的计数。大概是你在某个地方弄错了。单个查询的总数可以是更大,但是,如果有任何行&#39; number符合LIKE条件中的多个条件。