鉴于我有一张表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)
但这似乎不是最佳的。有更好的方法吗?
修改
答案 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