2012-03-14 243 views
0

我正在尝试编写一个基于今天的日期计算行和总条目的SUMS的查询。我的数据库中的日期字段是03/14/2012 2:03:19格式。该查询将忽略日期并返回数据库中所有条目的SUM。这里是我的查询:MySQL查询失败

$string = " 
    SELECT SUM(totalcollected) 
    FROM accounting 
    WHERE agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND amount1type = 'Cash' 
    OR amount2type = 'Cash' 
"; 

有什么建议?

+0

“*计算一行的SUMS *”...? – Lion 2012-03-14 21:24:03

+0

请考虑使用占位符而不是内插字符串来构建查询。另外,'CURRENT_DATE'与DATE(NOW())'说的相同,但是更直接一点。 – pilcrow 2012-03-14 21:28:08

+0

Plus在where子句中使用函数('DATE(date)')是一个性能杀手。 – 2012-03-14 21:32:18

回答

1

问题是AND解决OR过,但你可以用这个很酷的技巧避免OR完全:

SELECT SUM(totalcollected) 
FROM accounting 
WHERE agent = '$agentid' 
AND DATE(date) = DATE(NOW()) 
AND 'Cash' IN (amount1type, amount2type) 
+0

+1“IN(col1,col2)”的好主意!我还没有看到之前完成 – 2012-03-14 21:28:56

+0

@Bohemian在做日期(NOW())查询时,当前日期条目中的日期格式是否重要?你的查询仍然没有计算我的总收集行,我觉得它与日期有关。 – savagenoob 2012-03-14 22:04:42

+0

这个技巧需要'(amount1type,amount2type)'上的复合索引;否则就是性能杀手。 – 2012-03-14 22:16:51

2

我的猜测是,你缺少一些括号中的where条款等

最后的条件,or amount2type = 'cash'是允许所有其他条件是假的。你应该改变这种与对证amount1type进行分组:

SELECT SUM(amount1), SUM(amount2), SUM(monpay), SUM(totalcollected) 
FROM accounting 
WHERE 
    agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND (amount1type = 'Cash' OR amount2type = 'Cash') 
0

你需要括号来表示对数据库的你实际上要怎样做。更好的格式将使其更清晰

SELECT SUM(totalcollected) 
FROM accounting 
WHERE agent = '$agentid' 
    AND DATE(date) = DATE(NOW()) 
    AND amount1type = 'Cash' 
    OR amount2type = 'Cash' 

​​
3

MySQL Operator Precedence chart。你会发现,AND相比OR具有更高的优先级,这样您的查询就会变成这样的:

SELECT SUM(totalcollected) 
FROM accounting 
WHERE 
(
    agent = '$agentid' AND 
    DATE(DATE) = DATE(NOW()) AND 
    amount1type = 'Cash' 
) 
OR 
(
    amount2type = 'Cash' 
) 

注意,日期是考虑到当(i)代理= $剂(II)amount1type =现金;但amount2type = cash的行将始终返回,无论日期如何。你应该加括号来告诉MySQL究竟是如何在where子句应当处理:

SELECT SUM(totalcollected) 
FROM accounting 
WHERE 
agent = '$agentid' AND 
DATE(DATE) = DATE(NOW()) AND 
(
    amount1type = 'Cash' OR amount2type = 'Cash' 
)