【发布时间】:2026-01-24 22:20:02
【问题描述】:
我需要从具有“早上”事件的聊天(“普通”和“服务”类型)中选择 user.id=1 的所有消息(传入和传出)
这显示它们(附加图像上的选择 1)
SELECT *
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND event.name = 'morning'
但我必须排除我作为发件人的“服务”消息。 这很好用,但我不喜欢它(图片上的选择 2)
SELECT *
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND event.name = 'morning'
AND message.id NOT IN (
SELECT message.id
FROM `message`
JOIN chat
ON message.chat_id = chat.id
JOIN event
ON chat.event_id = event.id
JOIN chat_type
ON chat.chat_type_id = chat_type.id
WHERE (sender = 1 or recipient = 1)
AND sender = 1
AND chat_type.name = 'service'
)
架构和选择结果:
【问题讨论】:
-
您为什么不喜欢您的解决方案?运行需要多长时间?有多少记录?如果您希望我们优化您的查询,请分享您在受影响表上的所有索引以及查询解释的结果。
-
我们还没有太多字段;) 只有主键和外键字段被索引。我认为 where 子句中的 IF-ELSE 可以用来代替子查询,但很有趣 - 什么在数百万行上运行得更快?
标签: mysql optimization query-optimization