我正在尝试创建一个SQL查询,告诉我有多少用户拥有一个或多个产品。
我创建了这个查询,告诉我所有拥有产品的用户:
SELECT DISTINCT `users`.*
FROM `users`
INNER JOIN `products`
ON `users`.`id` = `products`.`creator_id`
但是,我想要用户的数量,而不是用户自己。
所以我创建了这个使用COUNT()
函数
SELECT DISTINCT COUNT(*)
FROM `users`
INNER JOIN `products`
ON `users`.`id` = `products`.`creator_id`
但我相信我错误地使用COUNT
因为此查询返回164
,这比之前返回的查询要多得多。
答案 0 :(得分:4)
SELECT COUNT(DISTINCT `users`.`id`)
FROM `users`
INNER JOIN `products`
ON `users`.`id` = `products`.`creator_id`
答案 1 :(得分:1)
DISTINCT
过滤结果行是唯一的。聚合(即COUNT()
)在事先完成,因此跟随您的JOIN
并计算用户两次。
因此,要获得拥有产品的用户数量,您可以这样做:
SELECT COUNT(DISTINCT u.id)
FROM users AS u
INNER JOIN products AS p
ON u.id = p.creator_id
同样,你可以做一些有用的事情,比如每个用户的产品数量:
SELECT u.id,
COUNT(*) AS ProductCount
FROM users AS u
INNER JOIN products AS p
ON u.id = p.creator_id
GROUP BY u.id
答案 2 :(得分:1)
以下查询可能更有效:
SELECT COUNT(*)
FROM `users` u
WHERE exists (select 1 from `products` p where u.id = p.creator_id);
product(creator_id)
上的索引效果最佳。而且,当某些用户拥有许多产品时,性能会优于join
/ count(distinct)
版本。