mysql 将每个用户的最高group_id计数为不同值

vngu2lb8  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(120)

在我最新的项目中有一点棘手的逻辑(至少对我来说),我一直试图使用HAVING来解决这个问题,但我所有的游戏都有不正确的结果。
我有一个将用户分配到用户组的链接表和另一个记录每个组中有多少用户的表,所以我不需要一直计算它们(第二个表在用户注册完成时更新)。
我遇到的麻烦是更新第二个表中数字的函数。
链接表看起来像这样,这里的示例数据解释了我的问题:

+----+---------+----------+
| id | user_id | group_id |
+----+---------+----------+
| 1  | 1       | 1        |
| 2  | 1       | 5        |
| 3  | 14      | 2        |
+----+---------+----------+

一个用户可以在任意数量的组中。事实上,为了成为一个组,用户必须在它下面的所有组中。这是因为每个组都有特定的权限分配给它。如果不对应用程序进行重大重写,这是无法改变的。
我想做的是只计算每个用户的最高组,因此在上面的示例数据中,用户1将只在组5中计数,使组1看起来是空的。
目前,所有条目都被计算在内,这意味着如果第4组中有3个人,那么这3个用户也被计算在第3、2和1组中,这使得我的数字相对没有意义。
到目前为止,我已经尝试了以下变体:

SELECT user_group_id, COUNT(user_id) members FROM `group_users` GROUP BY user_group_id HAVING count(user_group_id) = 1;

这给了我相同的多算数。然后我试着:

SELECT user_group_id, COUNT(user_id) members FROM `group_users` GROUP BY user_group_id HAVING COUNT(user_id) = 1;

但我现在明白了,我只要求那些没有出现在任何其他组中的用户。
我觉得我的思路是对的,但是我不知道条件应该在哪里或者是什么。我看到了一些类似进程的示例查询,但是所有的别名只会增加混乱。
有人能给我指个路吗?

4nkexdtk

4nkexdtk1#

您可以使用聚合来获取每个用户的max group_idCOUNT()窗口函数,以计算每个返回的max group_id s的用户数:

SELECT DISTINCT MAX(group_id) AS group_id,
       COUNT(*) OVER (PARTITION BY MAX(group_id)) AS members
FROM group_users
GROUP BY user_id;

这个查询过滤掉所有没有成员的group_id
如果你想得到所有group_id的结果,使用groups表的LEFT连接到上面的查询:

WITH cte AS (
  SELECT DISTINCT MAX(group_id) AS group_id,
         COUNT(*) OVER (PARTITION BY MAX(group_id)) AS members
  FROM group_users
  GROUP BY user_id
)
SELECT g.group_id,
       COALESCE(c.members, 0) AS members
FROM `groups` AS g LEFT JOIN cte AS c
ON c.group_id = g.group_id;

请参见简化的demo

相关问题