2016-05-04 126 views
0

我在看起来是相同的查询上有不同的结果。我很困惑为什么总数与查询不同。希望有人对这个问题有一个解释,也许说哪个应该是正确的总数。谢谢mysql查询总计总数的差异

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

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

+0

这两个查询字面上完全相同。你的意思是说,每次执行查询时都会得到不同的总数? – Danilo

+0

必须是在您的查询的2次运行之间插入的新行吗? –

+0

所以对不起,我现在粘贴错误的查询我有两个不同的查询 – joanb

回答

1

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

同样,AND具有比OR更高的优先级,因此首先完成。查看MySQL参考手册中的Operator Precedence部分。

这可能是你试图建立的代码:

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)。接下来,您的所有ANDS都会得到评估,并且您有答案。

+1

中的任何一个的总数,那么为什么要重要?非常感谢!。我现在知道了 – joanb

0

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

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

第一个查询正在评估所有OR S的作为一个条件 -

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

如果某行符合任何这些条件,它评估为真,然后移动到日期的约束。所以在第一个查询中只有两个顶级条件。

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

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 S的都为真,整个WHERE子句被评估为真。

+0

这很有道理,谢谢!如果任何一个条件的计算结果为真,如果最后我希望给定的月份的tm_notes等于 – joanb

0

你的第一个查询条件都是这样

Where 
--first condition 
(tm_notes = 'Session' OR tm_notes = 'Intake' OR tm_notes = 'OT' or tm_notes = 'PT' or tm_notes = 'Speech') 
AND 
-- second condition 
(tm_date BETWEEN '2016-04-01' AND '2016-04-30') 

您选择的条件都为真,第一个条件本身的条件的组合,

而在第二个查询你有这么多的条件OR等,如果任何条件成为现实,整个条件模式成为现实,所以有结果的差异

Where 
-- first condition 
(tm_date BETWEEN '2016-04-01' AND '2016-04-30') 
AND 
-- second condition 
tm_notes = 'Session' 
OR 
-- third condition 
tm_notes = 'Intake' 
OR 
-- fourth condition 
tm_notes = 'OT' 
OR 
-- fifth condition 
tm_notes = 'PT' 
-- sixth condition 
OR 
tm_notes = 'Speech' 
+0

这个条件是合理的,谢谢!如果任何一个条件的评估结果为真,如果最后我希望给定月份的tm_notes等于条件 – joanb

0

AND & OR工作像+ & -

a+(b*c)是不一样的(a+b)*c

同为AND & OR

a OR (b AND c)是不一样的(a OR b) AND c

所以要小心使用支架时你混淆了AND & OR