Mysql 按联接计数和分组
我有一张产品表和一张购买产品的用户表。在产品表A中有一个站点名称,它决定了产品的购买地点 表B显示了用户及其购买的产品 我使用下面的内容来显示购买的产品列表,按站点名称,将产品名称分组在一起Mysql 按联接计数和分组,mysql,sql,Mysql,Sql,我有一张产品表和一张购买产品的用户表。在产品表A中有一个站点名称,它决定了产品的购买地点 表B显示了用户及其购买的产品 我使用下面的内容来显示购买的产品列表,按站点名称,将产品名称分组在一起 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 pr
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
我搞不懂的是如何计算每条生产线购买的产品数量
e、 表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
因此,我想显示每一行的站点名称是ebay,以及购买了多少产品,大多数人首先订购,如:
chair 2
lamp 1
我会使用左联接,这样,如果有一个从未购买过的产品,它将显示为0
此外,我将使用COUNTusers.prod_id,而不是COUNT*,这样它将只计算满足左连接条件的行:
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
此外,我将使用COUNTusers.prod_id,而不是COUNT*,这样它将只计算满足左连接条件的行:
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
迈克尔的问题有一个小的改变
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
上述查询将不会返回尚未购买的产品。对Michael的查询进行了细微更改
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
以上查询不会返回尚未购买的产品。非常感谢,请快速提问。。。永远不会有一种产品从未被购买过。。。想象一下,遇到1000人,问你买了什么,他们从一个列表开始,总是有一个人买了一个,或者产品不会出现,但是可能有更多的用户买了相同的产品-这有意义吗?这会改变什么吗?假设每个用户都购买了至少一种产品,那么您可以将查询更改为使用内部连接而不是左连接,由于Left join返回product表中的所有行,即使与内部联接相比,它的购买速度并不慢。您可以使用@Prakash?@DarrenSweeney示例从Left join切换到内部联接,只需删除上面查询中的Left一词即可。然而,我不会假设产品至少被购买过一次。如果一个新产品刚刚添加,但还没有人有机会购买它呢?如果系统出现故障,导致无法购买特定产品,该怎么办?如果这个产品是布鲁托·纳什蓝光豪华版,没有人会买它呢?@MichaelFredrickson我拥有它!只是开玩笑。产品表建立在某人添加它的基础上。。。它不是一个购物网站更多的一个我买了你?非常感谢你,快速提问。。。永远不会有一种产品从未被购买过。。。想象一下,遇到1000人,问你买了什么,他们从一个列表开始,总是有一个人买了一个,或者产品不会出现,但是可能有更多的用户买了相同的产品-这有意义吗?这会改变什么吗?假设每个用户都购买了至少一种产品,那么您可以将查询更改为使用内部连接而不是左连接,由于Left join返回product表中的所有行,即使与内部联接相比,它的购买速度并不慢。您可以使用@Prakash?@DarrenSweeney示例从Left join切换到内部联接,只需删除上面查询中的Left一词即可。然而,我不会假设产品至少被购买过一次。如果一个新产品刚刚添加,但还没有人有机会购买它呢?如果系统出现故障,导致无法购买特定产品,该怎么办?如果这个产品是布鲁托·纳什蓝光豪华版,没有人会买它呢?@MichaelFredrickson我拥有它!只是开玩笑。产品表建立在某人添加它的基础上。。。它不是一个购物网站更多的一个我买了你?非常感谢你的帮助!这两种方法都能很好地工作,但这看起来确实快了一点。非常感谢您的帮助!这两种方法都能很好地工作,但看起来确实快了一点。