mysql - 选择sql中不反向重复的记录
问题描述
假设我们有一个包含两列用户对的简单表:user1 和 user2。此外,假设一些对出现两次(以相反的顺序),而另一些则没有。因此,例如,对 (1,2) 出现在 (user1=1 and user2=2) 的记录和 (user1=2 and user2=1) 的另一记录中,而对 (1,3) 出现仅作为(user1=1 和 user2=3)一次。
我想编写一个返回所有对但不包括重复项的查询,这意味着返回的查询每对只出现一次。因此,对于上面的示例,对 (1,2) 应仅显示为 (user1=1 and user2=2) 或 (user1=2 and user2=1),但不能同时显示。
在 postgre sql 中实现这一目标的最简单方法是什么?
解决方案
一个简单的方法是:
select user1, user2
from t
where user1 < user2 or
not exists (select 1
from t t2
where t2.user1 = t1.user2 and t2.user2 = t1.user1
);
第一个条件返回所有行user1 < user2
。第二个返回只有一对的所有行 - 但因为这都是相同的where
,所以满足第一个条件的一对只返回一次。
推荐阅读
- excel - 使用vba删除excel文件的密码
- ruby-on-rails - Is it possible to access attribute that is delegated to another model?
- java - Spring boot application staring failed in IntelliJ
- html - 为什么我不能在没有父不透明度超车的情况下定位这个 HTML 元素?
- arrays - Farthest Smaller Element in an Array
- php - 如何以毫秒为单位制作“mktime”格式?
- vuejs2 - 如何将 html 元素附加到 Element UI 表格中的表格行
- angular - RXJS:如何重置 BehaviorSubject 数组的值
- javascript - Vue + Jest global config carrying over into spec files
- node.js - 我将如何根据 node.js 中的其他字段值动态制作猫鼬模式?