我有一个与自身具有多对多关系的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;
我有时会因同一对而得到两个结果(例如,有时(亚当,伊娃)和(伊娃,亚当)是同一对)。我想实现的只是一对:(亚当,伊娃)。
如何实现?
您可以使用功能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);