sql - GROUPBY 多对多与自身
问题描述
我有一个与自身具有多对多关系的用户表,我想获取所有具有这种特定关系的用户对。问题是,在关系表中,我这样存储用户:
+------+---------------+
| 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) 是同一对)。我想要实现的只是一对:(亚当,伊娃)。
如何做到这一点?
解决方案
您可以使用函数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);
推荐阅读
- oracle11g - 显式游标传递表作为参数 PLS-00382
- mysql - 当第二个查询中没有记录时如何减去两个表的列值
- confluence - Confluence:模板中的用户宏
- python - 在python中抽取数据
- python - 如何终止特定的python程序?
- oauth-2.0 - Visual Studio Web Performance tests and Azure AD B2C sign-on process
- c# - Microsoft Office Access 数据库引擎无法打开或写入负载均衡器 asp.net 中的文件
- google-bigquery - 如何在大查询中使用标签来跟踪成本?
- button - 未捕获的类型错误:运行数据表角度指令时无法读取 button.flash.js 中未定义的属性“版本”
- javascript - 使用 morris.js 从条形图中删除悬停图例