查找(x,y)和(y,x)记录的最佳查询

时间:2014-03-30 10:59:35

标签: sql postgresql

鉴于我有一张表messages

sender_id    recipient_id
==========   =============
1            2
1            3
2            1

什么是获得记录的最佳查询,其中一个值为1,另一个为2,即对于上面的示例数据集,它应该返回(1,2)和(2,1)。目前我使用的是:

SELECT *
FROM messages
WHERE 1 IN (sender_id, recipient_id) AND 2 IN (sender_id, recipient_id)

但这似乎不是最佳的。有更好的方法吗?

修改

  • 我不需要过滤重复
  • 我有复合索引的sender_id和recipient_id

3 个答案:

答案 0 :(得分:2)

在我看来,最直接的方法是使用IN

select *
from messages
where (sender_id, recipient_id) in ((1, 2), (2, 1));

对SQL Fiddle的测试显示,它有时比波希米亚的答案更快,有时更慢,具体取决于存在的数据。但为了便于阅读,我认为这更好。

答案 1 :(得分:1)

select sender_id, recipient_id
from messages
where (least(sender_id, recipient_id), greatest(sender_id, recipient_id)) = (1,2);

如果需要,可以通过基于表达式的索引支持:

create index from_to_index on messages 
  ( least(sender_id, recipient_id), greatest(sender_id, recipient_id) );

答案 2 :(得分:1)

如果发件人不能也是收件人:

select * from messages
where sender_id in (1, 2)
and recipient_id in (1, 2)

如果两者都可以,请添加另一个过滤器:

select * from messages
where sender_id in (1, 2)
and recipient_id in (1, 2)
and sender_id != recipient_id