2012-09-28 52 views
1

我有一个产品表和已购买产品的用户表。在产品表A上有一个site_name,它决定了产品的购买地点。加入计数和加入组

表B显示了用户和他们购买的东西。

我正在使用以下内容显示通过site_name将产品名称分组在一起购买的产品列表。产品

SELECT product FROM A JOIN B ON A.prod_id = B.prod_id WHERE A.site_name = 'ebay' group by A.product 

表A是:为用户

prod_id 
site_name 
product 

表B是:

user_id 
prod_id 

什么,我无法弄清楚是如何获得的每买产品的数量线。

例如在表A中有

prod_id site_name product 
------- --------- ------- 
1   ebay   chair 
2   amazon  desk 
3   ebay   lamp 

和表B

user_id prod_id 
------- ------- 
1000   1 
1001   2 
1002   1 
1003   3 

所以,我想告诉每一行,其中SITE_NAME是eBay和多少产品被买了,为了大多数第一,如:

chair 2 
lamp  1 

回答

1

一个小的改动,以迈克尔的查询。

SELECT 
    products.product, 
    COUNT(users.prod_id) AS productsBought 
FROM 
    A AS products 
    INNER JOIN B AS users 
     ON products.prod_id = users.prod_id 
WHERE products.site_name = 'ebay' 
GROUP BY products.product 

上述查询不会返回尚未购买的产品。

+0

非常感谢您的帮助!两者都可以很好地工作,但是看起来好像速度更快。 –

+0

不是问题!! :) – Prakash

4

我会用一个LEFT JOIN,所以,如果有一个从未购买的产品,它会显示为0。

的计数

而且,我会用COUNT(users.prod_id),而不是COUNT(*),所以,它只会算其已经满足了LEFT JOIN条件的行:

SELECT 
    products.product, 
    COUNT(users.prod_id) AS productsBought 
FROM 
    A AS products 
    LEFT JOIN B AS users 
     ON products.prod_id = users.prod_id 
WHERE products.site_name = 'ebay' 
GROUP BY products.product 
+0

非常感谢你,快速提问......永远不会有一款从未被购买过的产品......想象一下满足1000人并询问你买了什么,他们以清单开头,总会有一个已经买了一个,或者该产品不会出现,但是因此可能有更多的用户购买了相同的产品 - 这是否合理?这会改变什么吗? –

+0

假设每个用户都购买了至少一个产品,那么您可以将查询更改为使用内部连接而不是左侧连接,因为左侧连接返回产品表中的所有行,即使尚未购买(与内部相比较慢加入)。 – Prakash

+0

你有一个例子@Prakash? –