【问题标题】:Count distinct records from child table for each user in MYSQL计算 MYSQL 中每个用户的子表中的不同记录
【发布时间】:2018-09-26 15:13:48
【问题描述】:

我有一个比赛,计算每个用户收集了多少物种。 这由 3 个表管理:

  1. 一个名为“sub”的父表带有集合,每个集合都是唯一的,有一个 id 并与一个用户 id 相关联。
    
    +----+---------+
    | id | user_id |
    +----+---------+
    |  1 |       1 |
    |  2 |      10 |
    |  3 |       1 |
    |  4 |       3 |
    |  5 |       1 |
    |  6 |      10 |
    +----+---------+
    
  2. 名为“sub_items”的子表包含多条唯一的specs记录,并通过sub id to id与父表相关联。(每个sub可以有多个specs记录)

+----+--------+---------+--+
| id | sub_id | spec_id |  |
+----+--------+---------+--+
|  1 |      1 |    1000 |  |
|  2 |      1 |    1003 |  |
|  3 |      1 |    2520 |  |
|  4 |      2 |    7600 |  |
|  5 |      2 |    1000 |  |
|  6 |      3 |      15 |  |
+----+--------+---------+--+
  1. 具有关联 user_id 的用户表

+--------+-------+--+
| usename | name    |
+---------+-------+--+
|      1 | David    |
|     10 | Ruth     |
|      3 | Rick     |
+--------+-------+--+

我需要按递减顺序列出具有最独特规格的用户。 预期输出: David 共有 2 个独特的规格。Ruth 共有 2 个独特的规格。



+--------+---------+
| id     | total   |
+----+-------------+
|  David |    2    |
|  Ruth  |    2    |
|  Rick  |    2    |
+----+-------------+

到目前为止,我有这个,它产生了一个结果。但它不准确,它计算总记录。 我可能在子查询中的某处遗漏了一个 DISTINCT。

SELECT s.id, s.user_id,u.name, sum(t.count) as total
FROM sub s
LEFT JOIN (
    SELECT id, sub_id, count(id) as count FROM sub_items GROUP BY sub_id
 ) t ON t.sub_id = s.id
 LEFT JOIN user u ON u.username = s.user_id
 GROUP BY user_id
 ORDER BY total DESC
 

我看过this 解决方案,但它没有考虑独特的方面

【问题讨论】:

    标签: mysql distinct


    【解决方案1】:

    您首先必须获得所有用户的最高“分数”,例如:

        SELECT count(DISTINCT si.id) as total
        FROM sub INNER JOIN sub_items si ON sub.id = su.sub_id
        GROUP BY sub.user_id
        ORDER BY total DESC
        LIMIT 1
    

    然后您可以使用它来将您的查询限制为共享该最高分数的用户:

    SELECT u.name, count(DISTINCT si.id) as total
    FROM
        user u
        INNER JOIN sub ON u.usename = sub.user_id
        INNER JOIN sub_items si ON sub.id = su.sub_id
    GROUP BY u.name
    HAVING total =
        (
            SELECT count(DISTINCT si.id) as total
            FROM sub INNER JOIN sub_items si ON sub.id = su.sub_id
            GROUP BY sub.user_id
            ORDER BY total DESC
            LIMIT 1
        )
    

    【讨论】:

    • 谢谢!我不确定你是否理解我需要的东西,能否弄清楚你所说的“最高分数”是什么意思。我想要的总分从高到低排序。
    • 在这种情况下,您可以删除 HAVING 子句,然后将所有内容添加并替换为 ORDER BY total desc。这里不需要子查询。
    【解决方案2】:

    这对我有用,我必须添加

    COUNT(distinct spec_id)
    

    到子查询

    SELECT s.id, s.user_id,u.name, sum(t.count) as total
    FROM sub s
    LEFT JOIN (
        SELECT sub_id, COUNT(distinct spec_id) as count FROM sub_items group by sub_id
     ) t ON t.sub_id = s.id
     LEFT JOIN user u ON u.username = s.user_id
     GROUP BY user_id
     ORDER BY total DESC
     

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多