在我最新的项目中有一点棘手的逻辑(至少对我来说),我一直试图使用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;
但我现在明白了,我只要求那些没有出现在任何其他组中的用户。
我觉得我的思路是对的,但是我不知道条件应该在哪里或者是什么。我看到了一些类似进程的示例查询,但是所有的别名只会增加混乱。
有人能给我指个路吗?
1条答案
按热度按时间4nkexdtk1#
您可以使用聚合来获取每个用户的max
group_id
和COUNT()
窗口函数,以计算每个返回的maxgroup_id
s的用户数:这个查询过滤掉所有没有成员的
group_id
。如果你想得到所有
group_id
的结果,使用groups
表的LEFT
连接到上面的查询:请参见简化的demo。