将具有不同WHERE和GROUP BY的行计数为1

时间:2014-02-15 15:21:56

标签: mysql sql count

T1 - id, name, userID (stocks) - not really used in this cased
T2 - id, name, stockID, userID (categories)
T3 - id, name, stockID, categoryID, quality, userID (goods)

专栏"质量"可以是" 0" (好)或" 1" (坏)和每件商品(甚至同类)= 1行

这个SQL,(这个"远"我可以得到),只显示好的和坏的东西的总数,如果类别存在,但没有任何行,那么它'未在最终结果中显示:

SELECT T2.name, COUNT(*) AS TOTAL FROM T3
LEFT JOIN T2 ON T2.id=T3.categoryID
WHERE T3.stockID=2 GROUP BY T3.categoryID

结果:

CATEGORY  - TOTAL
category1 - 1237
category2 -  857
category3 -  125

类别4没有显示,因为没有行,但我需要显示每一行,即使T3行不存在,当然还有BAD的东西。

期望的结果:

CATEGORY  - BAD / TOTAL
category1 - 425 / 1237
category2 - 326 /  857
category3 -   0 /  125
category4 -   0 /    0

2 个答案:

答案 0 :(得分:1)

SELECT T2.name, SUM(CASE WHEN T3.quality=1 THEN 1 ELSE 0 END)AS BAD,
       COUNT(*)AS TOTAL 
FROM T2
LEFT JOIN T3 ON T2.id=T3.categoryID
WHERE t2.stockid=2
GROUP BY T2.name;

答案 1 :(得分:0)

我想你想在另一个方向做left join(你也可以做right outer join)。并更改count()以计算匹配记录:

SELECT T2.name, coalesce(SUM(t.3bad), 0) as Bad, COUNT(t3.categoryID) AS TOTAL
FROM T2 LEFT JOIN
     T3
     ON T2.id = T3.categoryID and T3.stockID = 2;
GROUP BY T2.name;

此外,select group by子句中的group by字段也是一个好主意。真的,不仅仅是一个好主意。大多数数据库(和标准)通常都需要这样做。 where的MySQL扩展可能会导致问题。

请注意,我将on条件移到了{{1}}子句中。这可以防止额外的过滤,从而删除您想要的行。