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