如何使用多个表内部联接和分组来计算两个值?

时间:2014-02-07 19:03:25

标签: mysql count inner-join

我有一组表格,我试图按状态显示两个计数。它被证明有点棘手,部分原因是某些结果的计数为0.我不知道如何处理这些结果。

首先,我将展示我的桌面结构,然后我将解释我想要获得的重要性。我认为它可能很简单,但我对sql查询有点生疏。

以下是我的表格设置方式。我有一个主表,我也用它来加入其他表。

t1 (primary table)
ID, qrtID, sdID, published

t2
qID, qTypes, qSlug

t3
stateID, stateName, stateAbbr

值如此链接。 t1.qrtID = t2.qID,t1.sdID = t3.stateID。

qSlug值有2个可能的值(过去和现在),所以我想根据这些组得到计数。

我最终想要的是stateName,qSlug_count1和qSlug_count2的列。如果计数为“0”,我想显示“0”。

所以现在这就是我得到的。

SELECT * FROM
(SELECT sdID, COUNT(qrtID) AS past_count FROM t1 WHERE qrtID = "1" GROUP BY sdID) c1 
LEFT JOIN
(SELECT sdID, COUNT(qrtID) AS pres_count FROM t1 WHERE qrtID = "2" GROUP BY sdID) c2
ON c1.sdID = c2.sdID

此查询的结果接近我的需要,但我遗漏了一些数据。我需要获取stateName,stateAbbr,并且如果计数为0,则在列中显示0。所以所有州都应该在结果中得到证实。

所以,问题是我如何修改上面的查询以添加到附加表中并将它们连接到正确的值,并且如果没有匹配的记录也能够显示零值?

1 个答案:

答案 0 :(得分:1)

只需在单个查询中使用条件聚合:

SELECT sdID,
       sum(qrtID = "1") AS past_count
       sum(qrtID = "2") AS pres_count
FROM t1 
GROUP BY sdID;

您的查询缺少行,因为某些sdID只有1个而其他只有2个。您可能想要添加:

where qrtID in ("1", "2")

如果您不想要显示两个0的行。