如何在MySQL查询中组合WHERE和HAVING

时间:2016-09-12 22:26:18

标签: mysql group-by having

如何为MySQL编写一个过滤掉总薪水小于零的查询。 我使用'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 个答案:

答案 0 :(得分:1)

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;
相关问题