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

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)

请注意,还有多种其他方式可以以更高效的方式执行此操作。这是我能看到的最直接的方法。

于 2013-09-12T12:19:02.710 回答
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 子句执行联合 index_merge。

于 2013-09-12T12:20:34.027 回答
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 回答