2016-06-28 54 views
-2

帮助我理解为什么我得到不同支数SQL查询(AND和OR)混淆

查询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%' 

结果= 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%') 

结果= 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

+1

没有理由让三个单独查询的总和小于第二个查询的结果。看着这些数字,我怀疑你错误地输入了一些东西。 –

+0

第二和第三不能不同 –

+0

我会仔细检查我的所有号码 –

回答

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%'

如果所有查询都在相同的数据上执行,则三个单独查询的总计数不能小于第二个查询返回的计数。大概你在某个地方犯了一个错字。但是,如果有任何行'number s满足LIKE条件中的一个以上条件,则单个查询的总数可以是大于

+0

没有错别字,我添加了截图。 –

+0

@ M.ofCA,也许我的眼睛坏了,但我***发誓***你最后三个截图显示你的个人查询结果分别为0,4967和10000。这些总和为14967,这正是您从第二次完整查询中获得的数量。第二个单独查询的结果与您在问题文本中声明的结果不同(或者我可能失败的眼睛告诉我)。你还在告诉我没有错字吗? –