3表连接条款显示空值

时间:2013-11-30 20:40:25

标签: mysql join null

我有3个关于连锁超市的表: 商店(我有商店ID和城市) 客户(我有客户。身份证) 和 购买(我有商店ID,客户ID和每个客户购买的数量)。

我想列出在特定城市的商店购买的每个客户的购买总价值,但该商家信息应包含所有客户名称。

我试着按照以下方式进行:

SELECT customers.cname, SUM(purchases.quantity)
FROM stores LEFT OUTER JOIN purchases ON stores.SID = purchases.Stores AND stores.city     = 'Porto'
LEFT OUTER JOIN customers ON customers.CID = purchases.cust
GROUP BY customers.cname;

然而,这只返回在该城市购买的客户,而不是那些没有购买的客户。

我该如何解决这个问题?

谢谢!

编辑:

CNAME          SUM(PURCHASES.QUANTITY)
Abel Antunes    3
Berta Borges    13
Carlos Caldas   6
Daniela Dimas   3
Elvira Elvas    14

上面的结果就是使用你的例子(Filipe Silva)表的样子

执行以下声明:

SELECT customers.cname, SUM(purchases.quantity)
FROM stores LEFT OUTER JOIN purchases ON stores.SID = purchases.Stores AND stores.city = 'Porto'
LEFT OUTER JOIN customers ON customers.CID = purchases.cust
GROUP BY customers.cname;

下表中的结果:

CNAME   SUM(PURCHASES.QUANTITY)
(null)  (null)
Abel Antunes    1
Berta Borges    5
Daniela Dimas   2

代表正确的值,但缺少客户列表的其余部分。 期望的结果应该是:

CNAME   SUM(PURCHASES.QUANTITY)
Abel Antunes    1
Berta Borges    5
Carlos Caldas       NULL
Daniela Dimas   2
Elvira Elvas        NULL

希望这能澄清它!

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT customers.cname,
  SUM(purchases.quantity)
FROM customers
LEFT OUTER JOIN purchases ON customers.CID = purchases.cust
LEFT OUTER JOIN stores ON stores.SID = purchases.Stores
  AND stores.city = 'Porto'
GROUP BY customers.cname;

您试图吸引客户,但LEFT JOIN上的左表是stores,而不是customers。这样您就可以使用相同的联接,但客户位于LEFT JOIN的“左侧”。

这可以为您提供所需的信息。

答案 1 :(得分:0)

我得到了答案 - 这个问题实际上已经通过工会解决了:

(SELECT customers.cname, SUM(purchases.quantity)
FROM customers, purchases, stores
WHERE customers.CID = purchases.cust
AND purchases.Stores = stores.SID
AND stores.city = 'Porto'
GROUP BY customers.cname)
UNION
(SELECT customers.cname, NULL
FROM customers,purchases
WHERE customers.CID = purchases.cust
AND customers.CID NOT IN (SELECT purchases.cust
                              FROM purchases,stores
                              WHERE purchases.Stores = stores.SID
                              AND stores.city = 'Porto'));

非常感谢!