从具有双组的查询中获取0的计数

时间:2012-03-19 16:07:54

标签: mysql sql count group-by

我正在尝试编写一个查询,该查询获取由两个不同的事物分类的表(称为项目)的计数,称为类型和代码。我希望输出的内容如下:

Type Code Count
1    A    3
1    B    0
1    C    10
2    A    0
2    B    13
2    C    2

等等。

类型和代码都可以在查找表中找到,每个项目只能有一种类型但只有一个以上的代码,因此代码中还有一个数据透视表(也称为联结或联接)表。我有一个查询可以得到这个结果:

Type Code Count
1    A    3
1    C    10
2    B    13
2    C    2

它看起来像(省略了连接条件):

SELECT typelookup.name, codelookup.name, COUNT(item.id)
FROM typelookup
LEFT OUTER JOIN item JOIN itemcodepivot 
RIGHT OUTER JOIN codelookup
GROUP BY typelookup.name, codelookup.name

有没有办法改变这个查询以获得我正在寻找的结果?这是在MySQL,如果这很重要。我不确定在一个查询中这是可能的,但如果它是我真的想知道如何。谢谢你的任何想法。

3 个答案:

答案 0 :(得分:4)

CROSS JOINtypelookup之间的codelookup应解决此问题:

SELECT t.name, c.name, COUNT(item.id)
FROM typelookup t
CROSS JOIN codelookup c
LEFT JOIN itemCodePivot icp ON icp.codeId = c.codeId
LEFT JOIN item i ON i.itemId = icp.itemId AND i.TypeId = t.TypeId
GROUP BY t.name, c.name

答案 1 :(得分:3)

你可以使用交叉联接吗? http://dev.mysql.com/doc/refman/5.0/en/join.html

SELECT typelookup.name, codelookup.name, COUNT(item.id)
FROM codelookup CROSS JOIN typelookup
LEFT OUTER JOIN item JOIN itemcodepivot 
GROUP BY typelookup.name, codelookup.name

交叉连接应该使所有类型都加入所有代码。当你没有所有的表声明但很难做出正确的SQL但是你可以尝试一下..

答案 2 :(得分:0)

请注意,您应该替换实际的JOIN条件而不是使用我的。

SELECT tl.name, cl.name, IFNULL(COUNT(i.id),0)
FROM typelookup tl 
LEFT JOIN item i ON tl.item_id = i.id
LEFT JOIN itemcodepivot icp ON icp.item_id = i.id
LEFT JOIN codelookup cl ON cl.id = icp.codelookup_id
GROUP BY tl.name, cl.name;

试试这个,看看你的计数看起来如何。

我不理解你在codelookup上对RIGHT JOIN的需求。如果此(编辑)没有提供您想要的内容,请尝试将其添加回来。