【问题标题】:How to count number of distinct values when joining multiple tables?连接多个表时如何计算不同值的数量?
【发布时间】:2013-05-01 23:52:46
【问题描述】:

我有以下数据库表

categories
id, name

products
category_id, id, product_name, user_id

product_comments
product_id, id, comment_text, user_id

我需要计算 products 和 product_cmets 表中不同用户的数量。我有以下查询,其中我选择了所有这些类别,其中至少有一个产品,每个产品可能有零个或一些 cmets ......但我不知道如何获得这些不同用户 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

我需要 products 和 product_cmets 表中不同用户 ID 的总数。

我希望结果数据有点像下面:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这将为您提供总体计数,而不是所有不同 id 的列表:

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

    【讨论】:

    • 有 2 个不同的 user_ids...product.userid,product_cmets.userid ...我认为上面的行不通?
    • 对不起 - 你是对的。您最好使用来自@Adam 的UNION 查询答案并将COUNT 包裹起来。至于我,是时候喝更多咖啡了:)
    【解决方案2】:

    如果您想要不同的用户,那么您可以尝试以下方法:

    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; 
    

    【讨论】:

    • 使用上述查询时如何获取类别数据?
    【解决方案3】:
    select user_id from products
    UNION
    select user_id from product_comments
    

    这将为您提供表中存在的不同用户 ID 列表。用户可能只出现在其中一个表中,也可能同时出现在这两个表中,并且仍将包含在列表中。

    【讨论】:

      【解决方案4】:

      您可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-11
        • 2016-06-17
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多