GROUPBY本身具有多对多

问题描述 投票:0回答:1

我有一个与自身具有多对多关系的User表,我想获得具有这种特定关系的所有成对的用户。问题是,在关系表中,我这样存储用户:

+------+---------------+
| 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;

我有时会因同一对而得到两个结果(例如,有时(亚当,伊娃)和(伊娃,亚当)是同一对)。我想实现的只是一对:(亚当,伊娃)。

如何实现?

sql postgresql many-to-many
1个回答
0
投票

您可以使用功能least()greatest()

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 LEAST(left_user_id, right_user_id), GREATEST(left_user_id, right_user_id);

或者在这种情况下,您不需要连接:

SELECT count(*)
FROM relation 
GROUP BY LEAST(left_user_id, right_user_id), GREATEST(left_user_id, right_user_id);
© www.soinside.com 2019 - 2024. All rights reserved.