加入条件字段

时间:2013-09-12 12:14:58

标签: mysql left-join

我有一张消息表:

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问题得到的这个查询,但我读过它根本没有效率,那么什么是更好的查询呢?

3 个答案:

答案 0 :(得分:1)

这样可行:

SELECT *
FROM message
JOIN users ON (message.sender_id = 1 AND user.id = message.recipient_id)
           OR (message.recipient_id = 1 AND user.id = message.sender_id)

请注意,还有其他各种方法可以更高效地执行此操作。这是我能看到的最简单的方法。

答案 1 :(得分: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
)

答案 2 :(得分:0)

您的方式可行,但联接不会使用索引。如果您想要快速加入,则需要joined_table_indexed_field = some_expression之类的内容,例如:

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

在这种情况下,@ Grim的解决方案更好,因为它不依赖于mysql来为where子句执行union index_merge。