首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql查询求和总数的差异

mysql查询求和总数的差异
EN

Stack Overflow用户
提问于 2016-05-04 15:54:13
回答 5查看 88关注 0票数 0

对于相同的查询,我有不同的结果。我很不明白为什么总数与查询不同。希望有人在这个问题上有一个解释,也许可以说,哪一个应该是正确的总数。谢谢

代码语言:javascript
复制
select sum(tm_hours) 
FROM bhds_timecard 
WHERE (tm_notes = 'Session' 
 OR tm_notes = 'Intake' 
 OR tm_notes = 'OT' 
 or tm_notes = 'PT' 
 or tm_notes = 'Speech') 
AND (tm_date BETWEEN '2016-04-01' AND '2016-04-30')

总数为1792.25。

代码语言:javascript
复制
SELECT SUM(tm_hours) 
FROM bhds_timecard 
WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech'

总数为1796.25。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-05-05 01:12:45

如果您理解5+3*2= 11的原因,那么这将有助于了解问题的根源。有些人可能会错误地认为上面的计算应该给你16,因为他们不知道操作的顺序。乘法优先于加法,所以首先进行乘法。

同样地,并且优先级高于OR,所以它是首先完成的。查看算子优先参考手册中的MySQL部分。

这很可能是您试图构建的代码:

代码语言:javascript
复制
SELECT SUM(tm_hours) 
FROM bhds_timecard 
WHERE tm_date BETWEEN '2016-04-01' AND '2016-04-30'
AND (tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech');

在这种情况下,由于括号覆盖了操作的标准顺序,所以首先执行括号中的所有操作(这些都是OR语句)。因此,如果只有其中一个条件计算为TRUE,则整个括号部分将计算为TRUE)。接下来,你所有的和得到评估,你有你的答案。

票数 1
EN

Stack Overflow用户

发布于 2016-05-04 16:07:16

第二个查询必须是这样的:

代码语言:javascript
复制
SELECT SUM(tm_hours) FROM bhds_timecard WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND (tm_notes = 'Session' OR tm_notes = 'Intake' OR tm_notes = 'OT' OR tm_notes = 'PT' OR tm_notes = 'Speech')

您将丢失第二组条件的(括号。

票数 0
EN

Stack Overflow用户

发布于 2016-05-04 16:09:32

第一个查询是将所有的OR计算为一个条件-

代码语言:javascript
复制
WHERE (tm_notes = 'Session' 
 OR tm_notes = 'Intake' 
 OR tm_notes = 'OT' 
 or tm_notes = 'PT' 
 or tm_notes = 'Speech')
AND (tm_date BETWEEN '2016-04-01' AND '2016-04-30')

如果某一行满足任何这些条件,则它的计算结果为true,然后转到date约束。因此,在第一个查询中实际上只有2个顶级条件。

第二个查询实际上有6个条件-

代码语言:javascript
复制
WHERE (tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND tm_notes = 'Session' 
OR tm_notes = 'Intake' 
OR tm_notes = 'OT' 
OR tm_notes = 'PT' 
OR tm_notes = 'Speech'

如果6个OR中的任何一个为true,则计算整个WHERE子句为true。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37032639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档