我正在尝试编写一个查询,该查询获取由两个不同的事物分类的表(称为项目)的计数,称为类型和代码。我希望输出的内容如下:
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,如果这很重要。我不确定在一个查询中这是可能的,但如果它是我真的想知道如何。谢谢你的任何想法。
答案 0 :(得分:4)
CROSS JOIN
和typelookup
之间的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的需求。如果此(编辑)没有提供您想要的内容,请尝试将其添加回来。