使用2个右连接和分组依据查询不会显示正确的结果

时间:2011-03-23 16:26:39

标签: mysql join group-by

有人可以帮我解决这个问题吗?

我有3个表:订单,客户和产品。

我需要列出每个客户+每个产品的订单数量。 像这样:

Customer A    Product X     4
Customer A    Product Y     0
Customer A    Product Z     0
Customer B    Product X     2
Customer B    Product Y     0
Customer B    Product Z     1
Customer C    Product X     0
Customer C    Product Y     0
Customer C    Product Z     8

我尝试了这样的查询:

SELECT c.Name, p.Name, COUNT(o.OrderID)
FROM orders AS o
RIGHT JOIN customers AS c ON c.CustomerID=o.CustomerID
RIGHT JOIN products AS p ON p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

但是我无法让它发挥作用! 它仅显示计数器> 0的组合(其中“订单”中有记录)。但只有1个加入它才能正常工作,然后它正确地显示计数器为0的记录。(在这个例子中没有出售Y的产品,但我确实希望在组合列表中看到Y)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用交叉连接。这是Oracle SQL,因此不确定它是否适用于mysql。

select c.Name, p.Name, count(o.orderid)
from customers c cross join products p
left join orders o on c.customerid=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name
order by c.name, p.name

答案 1 :(得分:0)

您希望使用外部联接并让客户成为查询的左侧,然后将订单作为剩余查询的左侧,因为客户是您要分组的订单。

我更喜欢左外连接,因为它们更好地映射到你的实际意思:

SELECT c.Name, p.Name, COUNT(o.OrderID)
FROM customers c
  left outer join orders o ON c.CustomerID=o.CustomerID
  left outer join products p ON p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

答案 2 :(得分:0)

select c.Name, p.Name, sum(case when o.ProductId is not null then 1 else 0 end)
from customers c,products p
left join orders o on c.CustomerID=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

如果它仍然不起作用,你可以这样做,这应该是一个等价的

select c.Name, p.Name, sum(case when o.ProductId is not null then 1 else 0 end)
from customers c
join products p on 1=1
left join orders o on c.CustomerID=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

(我猜这里......因为我说我手头没有sql)