2011-02-13 122 views
8

我在查询中显示与其关联的产品数量的商店列表时遇到问题。我已经玩了很长一段时间了,但是无济于事。该表具有下述结构:Count()和左连接问题

商店表含有列:idname

产品含有表列:idnamestatusshop

查询是如下:

select s.name 
     , p.name 
     , count(p.id) 
from Product as p 
     left join Shop as s on p.shop=s.id 
where p.status <> '8796107276379' 
group by 
     s.id 

我没有得到有0产品的商店。我该如何做到这一点?

底层数据库是MySQL。

谢谢! Krt_Malta

+0

尝试顶替右连接,而不是一直 – 2011-02-13 10:03:35

+1

不,这是行不通的。我得到以下错误:在[p:product,s right:Shop]中找不到(可见)别名s的类型。 (这是专有的查询语言) – 2011-02-13 10:10:23

回答

21

您需要在左侧购买SHOP,因为右侧可能没有数据,在这种情况下为PRODUCT。

不仅如此,您需要将WHERE条件作为LEFT-JOIN ON条件,以便它在状态条件下加入产品,并且即使在不需要状态时也会打折(同时保留店铺)产品。

select s.name 
     , p.name 
     , count(p.id) 
from Shop as s 
     left join Product as p on p.shop=s.id AND p.status <> '8796107276379' 
group by 
     s.id, p.name 
0

您需要将OR p.status IS NULL添加到where子句中。

select s.name, p.name, count(p.id) 
from Shop s 
left join Product p on p.shop = s.id 
where (p.status <> '8796107276379' OR p.status IS NULL) 
group by s.name, p.name 
+0

Nope没有工作。为什么你认为应该使用p.status IS NULL? – 2011-02-13 10:16:33

+0

你说你的查询没有返回没有任何产品的商店。如果没有“OR p.status IS NULL”,你的where子句确实会排除所有这些情况,因为比较“NULL <>'8796107276379'”永远不会是真的。 NULL与任何东西都不相等(甚至是另一个NULL),也不等于任何东西。 – Tommi 2011-02-13 10:20:27

1
select s.name 
     , p.name 
     , count(p.id) 
from Shop as s 
     left join Product as p on s.id=p.shop 
where p.status <> '8796107276379' 
group by 
     s.id 
0

我遭受这样的疑难杂症太多,虽然我不完全知道为什么,把谓语的jojn本身,而不是实际的主查询是如何解决这个问题。

在阅读本文之前,我实际记录了整件事情。我用二两小桌子一个简单的例子,它说明了我希望的区别,也许这将有助于

http://simpleritsolutions.com/sql/left/join/problems