我有这个用户对表:
我怎么能选择行,所以我有一对?例如,如果我有1-2,我不需要2-1。所以这是期望的输出:
1 | 2
4 | 11
5 | 6
7 | 8
可能这种情况下查询过于复杂,最好只获得图像的结果,并在应用程序中处理结果集。
我使用PostgreSQL,如果这有助于优化查询。
答案 0 :(得分:2)
您可以使用least()
和greatest()
函数执行此操作:
select distinct least(user_id, pair_id), greatest(user_id, pair_id)
from userpairs;
此方法有可能返回表中实际不存在的对(例如,如果出现“(9,3)”且没有“(3,9)”)。如果您只需要表中的实际对,则可以执行以下操作:
select user_id, pair_id
from userpairs up1
where user_id <= pair_id or
not exists (select 1
from user_pairs up2
where up2.user_id = up1.pair_id and up2.pair_id = up1.user_id
);
如果原始数据中可能存在重复项,那么您也需要select distinct
。否则没有必要。
答案 1 :(得分:0)
假设没有完全相同的副本可以处理:
SELECT *
FROM pair p
WHERE NOT EXISTS (
SELECT 1
FROM pair
WHERE (user_id, pair_id) = (p.pair_id, p.user_id)
AND pair_id < user_id
)