groupby多对多

mftmpeh8  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(375)

我有一个用户表,它本身有一个多对多的关系,我想得到所有具有这个特定关系的用户对。问题是,在关系表中,我像这样存储用户:

+------+---------------+
| User |   relation    |
+------+---------------+
| id   | left_user_id  |
| name | right_user_id |
| ...  | ...           |
+------+---------------+

所以当我做一个基本的

SELECT count(*)
FROM relation LEFT OUTER JOIN user AS user_1 ON user_1.id = relation.left_user_id
              LEFT OUTER JOIN user AS user_2 ON user_2.id = relation.right_user_id 
GROUP BY left_user_id, right_user_id;

我有时会对同一对得到两个结果(例如有时(adam,eva)和(eva,adam),它们是同一对)。我想要的只是一双:(亚当,伊娃)。
如何做到这一点?

but5z9lq

but5z9lq1#

你可以使用这些函数 least() 以及 greatest() :

SELECT count(*)
FROM relation r
LEFT OUTER JOIN user AS user_1 ON user_1.id = r.left_user_id
LEFT OUTER JOIN user AS user_2 ON user_2.id = r.right_user_id 
GROUP BY LEAST(r.left_user_id, r.right_user_id), GREATEST(r.left_user_id, r.right_user_id);

或者在不需要连接的情况下:

SELECT count(*)
FROM relation 
GROUP BY LEAST(left_user_id, right_user_id), GREATEST(left_user_id, right_user_id);
tcomlyy6

tcomlyy62#

这个 left join 应该不需要。关键是使用 least() 以及 greatest() . 那就是:

SELECT LEAST(r.left_user_id, r.right_user_id) as user_id_1,
       GREATEST(r.left_user_id, r.right_user_id) as user_id_2,
       COUNT(*)
FROM relation 
GROUP BY user_id_1, user_id_2;

这种方法需要注意的一点是,结果集中的数据对可能不在原始数据中——按顺序排列。所以,如果数据中有一次“夏娃”/“亚当”,那么它将返回:“亚当”/“夏娃”/1。如果有必要,可以解决这个问题。

相关问题