帮助我理解为什么我会得到不同的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来改变表名
答案 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_id
和updated_at
上的条件仅适用于number LIKE 'A390%'
的行。
如果对同一数据执行所有查询,则三个单独查询的总计数不能小于第二个查询返回的计数。大概是你在某个地方弄错了。单个查询的总数可以是更大,但是,如果有任何行&#39; number
符合LIKE
条件中的多个条件。