如何在此上下文中正确使用SQL COUNT()函数?

时间:2014-03-14 12:56:08

标签: mysql sql

我正在尝试创建一个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,这比之前返回的查询要多得多。

3 个答案:

答案 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)版本。