2017-05-06 190 views
0

我有使用这些列存储的消息的消息传送系统:SQL检查是否A和B IN(...)

  • 消息,这是实际的消息
  • to_id,用户的编号“会收到消息
  • from_id,发送消息

我想查询像这样的对话的用户的ID:

SELECT sender.username, message 
FROM messages 
JOIN users sender ON sender.id=messages.from_id 
JOIN users receiver ON receiver.id=messages.to_id 
WHERE (sender.username LIKE 'user1' AND receiver.username LIKE 'user2') 
OR (receiver.username LIKE 'user1' AND sender.username LIKE 'user2') 

其工作原理,但我想通过USER1user2的只有一次,类似

WHERE (from_id, to_id) IN ((SELECT id FROM users WHERE username LIKE 'user1'), 
(SELECT id FROM users WHERE username LIKE 'user2')) 

不mysql中工作。有什么建议么?

+1

除非您实际上不需要'LIKE',而是可以使用'=',否则我认为您的原始方法可能是最好的方法。 – Ryan

回答

3

你可以做到这一点使用的元组:

SELECT sender.username, message 
FROM messages m JOIN 
    users sender 
    ON sender.id = m.from_id JOIN 
    users receiver 
    ON receiver.id = m.to_id 
WHERE ('user1', 'user2') in ((sender.username, receiver.username), 
           (receiver.username, sender.username), 
          ); 

这应该没有从性能的角度差异。

+0

查询计划应该被验证。从历史上看,这种结构导致了全表扫描,因为优化器不了解其含义,表达式得到非常晚的评估,“使用where”。 –

+0

@ Michael-sqlbot。 。 。原始代码也会导致全表扫描。避免这种情况需要重写查询的性能,这不是OP的目标。 –

+0

有了这个想法,你是绝对正确的,它应该没有区别。 :) –

相关问题