Mysql 3出现空值的子句的表联接

Mysql 3出现空值的子句的表联接,mysql,join,null,Mysql,Join,Null,我有3张关于连锁超市的桌子: 商店(我有商店ID和城市) 客户(我有客户ID) 和 购买(我有店铺ID、客户ID和每位客户购买的数量) 我想列出每个在给定城市商店购买的客户的总购买价值,但清单中应包括所有客户的姓名 我试着做到如下: SELECT customers.cname, SUM(purchases.quantity) FROM stores LEFT OUTER JOIN purchases ON stores.SID = purchases.Stores AND stores.cit

我有3张关于连锁超市的桌子: 商店(我有商店ID和城市) 客户(我有客户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;
然而,这只会返回在上述城市购买的客户,而不是尚未购买的客户

我应该如何解决这个问题

谢谢大家!

编辑:

上面的结果是使用您的示例得到的表(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
希望这能澄清它

试试这个:

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;
您试图获取客户,但
左联接
上的左表是
存储
,而不是
客户
。这样,您就拥有了相同的连接,但客户位于
左侧连接的“左侧”

这会给你你想要的东西。

试试这个:

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;
您试图获取客户,但
左联接
上的左表是
存储
,而不是
客户
。这样,您就拥有了相同的连接,但客户位于
左侧连接的“左侧”


这应该会给你你想要的东西。

我找到了答案-这个问题实际上是通过工会解决的:

(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'));

无论如何谢谢你

我已经找到了答案——这个问题实际上是通过工会解决的:

(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'));

无论如何谢谢你

谢谢你的回复。然而,结果仍然列出了所有购买的数量,无论购买的是哪家商店。结果应该是3b空c1d空,虽然我得到的是13b12c19d20等等。。。这意味着我得到的是购买数量的总价值,而不仅仅是特定商店的购买量!有什么线索吗?再次感谢你们!你能把结构和一些示例数据添加到,使其更容易帮助你吗?在原始问题中添加!我希望您将原始数据添加到SQLFIDLE,以便在给您提供另一个可能不起作用的查询之前对其进行测试。你能做到吗?@user305343。同时,尝试用内部联接替换第二个左联接。谢谢您的回复。然而,结果仍然列出了所有购买的数量,无论购买的是哪家商店。结果应该是3b空c1d空,虽然我得到的是13b12c19d20等等。。。这意味着我得到的是购买数量的总价值,而不仅仅是特定商店的购买量!有什么线索吗?再次感谢你们!你能把结构和一些示例数据添加到,使其更容易帮助你吗?在原始问题中添加!我希望您将原始数据添加到SQLFIDLE,以便在给您提供另一个可能不起作用的查询之前对其进行测试。你能做到吗?@user305343。同时,尝试用内部联接替换第二个左联接。