3

メッセージの表があります:

id
sender_id
recipient_id

私は、ユーザー (id: 1 ) のすべてのメッセージをプルし、彼が送信者または受信者のいずれかであり、彼が話していた「他の人」に参加したいと考えています。

何かのようなもの:

SELECT * FROM `message`
LEFT JOIN `user` AS u ON IF(sender_id != 1, sender_id = u.id, recipient_id = u.id)
WHERE sender_id=1 OR recipient_id=1

送信者受信者の両方に参加しない理由は、検索対象のユーザーが既にいるためです。そのため、別の方法で言わない限り、すべてのメッセージで彼に参加するのはもったいないと思います。

このクエリは別のSOの質問から取得しましたが、まったく効率的ではないことを読んだので、より良いクエリは何でしょうか?

4

3 に答える 3

0

ユニオンを試すことができます:

(
SELECT * FROM `message`
INNER JOIN `user` u ON u.id = recipient_id
WHERE sender_id = 1
) UNION (
SELECT * FROM `message` 
INNER JOIN `user` u ON u.id = sender_id 
WHERE recipient_id = 1
)
于 2013-09-12T12:18:32.473 に答える