如何在连接多个表时统计不同值的数量?

问题描述:

我有以下的数据库表如何在连接多个表时统计不同值的数量?

categories 
id, name 

products 
category_id, id, product_name, user_id 

product_comments 
product_id, id, comment_text, user_id 

我需要在产品和product_comments表不同用户数的计数。我已经得到以下查询,我选择了所有那些至少有一个产品的类别,每个产品可能有零个或一些评论......但我无法弄清楚的是如何获得这些不同的用户ID的总和..如果它从一个表只是我会尝试COUNT(products.user_id)......。这里是我的查询..

SELECT 
c.* 
FROM categories c 
INNER JOIN products p ON p.category_id = c.id 
LEFT JOIN product_comments pc ON pc.product_id = p.id 

我需要从产品和product_comments表不同用户ID的总数。

我希望的结果数据有点象下面这样:

Category_id, Category_name, TotalUsers 
1, Test Category, 10 
2, Another Category, 5 
3, Yet another cat, 3 

select user_id from products 
UNION 
select user_id from product_comments 

这会给你存在的表中的用户ID的不同列表。用户可以只出现在其中一个表格中,或者两者都包含在列表中。

这会给你一个整体计数,而不是所有不同ID的列表:

SELECT COUNT(DISTINCT user_id) 
FROM products 
LEFT JOIN product_comments comm ON products.id = comm.product_id 
+0

有2个不同的user_ids ... product.userid,product_comments.userid ...我不认为上面会工作? – user1421214 2013-05-01 16:02:00

+0

对不起 - 你是对的。你最好使用@Adam的'UNION'查询答案并在其周围包装一个'COUNT'。至于我,是时候多喝咖啡:) – 2013-05-01 16:04:45

您可以使用DISTINCT关键字和COUNT()函数

SELECT DISTINCT 
COUNT(c.*) 
FROM categories c 
INNER JOIN products p ON p.category_id = c.id 
LEFT JOIN product_comments pc ON pc.product_id = p.id 

如果你想不同的用户,那么你可以尝试这样的:

select distinct user_id from (
    select user_id from products 
    UNION 
    select user_id from product_comments 
) as allusers; 

然后你可以数得过来:

select count(distinct user_id) from (
    select user_id from products 
    UNION 
    select user_id from product_comments 
) as allusers; 
+0

如何在使用上述查询时获得分类数据? – user1421214 2013-05-01 16:01:12