2017-05-06 67 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

有了這個想法,你是絕對正確的,它應該沒有區別。 :) –

相關問題