如何在MySQL查询中将WHERE和HAVING结合起来

如何在MySQL查询中将WHERE和HAVING结合起来

问题描述:

如何为MySQL编写一个查询来筛选出总薪酬小于零的地方。 我尝试过使用'HAVING'的不同命令,但我无法弄清楚正确的语法。如何在MySQL查询中将WHERE和HAVING结合起来

这是我的命令:

SELECT tickets.idno, tickets.PAY, tickets.MATERIAL 
FROM tickets 
WHERE (tickets.PAY <> 0 OR tickets.MATERIAL <> 0) AND tickets.DISTRICT = 'HO' AND tickets.DATEPAID IS NULL 
ORDER BY tickets.NAME 

这个结果集:

HO0045 -140 0 
HO2203 -45  0 
HO2411 -5  0 
HO2411 20  0 
HO3448 -156 0 
HO2519 2000 0 
HO0075 -300 0 
HO1669 -55  0 
HO2666 -200 0 
HO2666 -200 0 
HO3447 -400 0 
HO3447 400  0 

这是结果,我现在得到的,但它需要消除这些记录中,其中总收入+总材料给定IDNO的所有行都小于零。例如; HO2411和HO2519的所有行应该出现,但不是其余的。

+1

见http://meta.stackoverflow.com/问题/ 333952 /为什么,应该-I-提供-AN-MCVE换什么,似乎对我将要-A-极简单的SQL查询 – Strawberry

HAVING是为了过滤出整个组,但要做到这一点,您需要减少查询GROUP BY。但不幸的是,您不能在过滤组后反转分组操作。

所以你要做的子查询过滤的组,然后JOIN导致回表,找到相应的IDNO行:

SELECT t.idno, t.PAY, t.MATERIAL 
FROM tickets AS t 
INNER JOIN (
    SELECT idno, SUM(PAY) AS PAY, SUM(MATERIAL) AS MATERIAL 
    FROM tickets 
    GROUP BY idno 
    HAVING PAY + MATERIAL < 0 
) AS total USING (idno) 
WHERE t.DISTRICT = 'HO' AND t.DATEPAID IS NULL 
ORDER BY t.NAME;