mysql - 在MySQL 5中,如何根据连接编写 "not exists"子查询?

标签 mysql join subquery innodb

我正在使用 MySQL 5.5.37(InnodB 引擎)。我读过,出于性能原因,将子查询重写为涉及连接的内容可能会更好。下面是我想要运行的查询的极其简化的版本...

select m.* from msg m where    
    not (exists (select mr.ID from msg_read mr where mr.MESSAGE_ID=m.ID and mr.RECIPIENT='USER1')) and m.AUTHOR<>'USER1'; 

我不知道如何在连接方面重写“不存在”。有人可以提供一些指导吗?

最佳答案

使用LEFT JOIN,然后测试要连接的表中的匹配列是否为NULL

SELECT DISTINCT m.*
FROM msg AS m
LEFT JOIN msg_read AS mr
    ON mr.message_id = m.id AND mr.recipient = 'USER1'
WHERE m.author <> 'USER1'
AND mr.message_id IS NULL

关于mysql - 在MySQL 5中,如何根据连接编写 "not exists"子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25773942/

相关文章:

lucene - 有什么方法可以合并 solr 中的两个查询吗?

MySQL:SEARCH 查询中的 mysql_real_escape_string

MySQL根据字段值加入不同的表

sql - 是否可以重用子查询?

MySQL:连接三个表,比较两个值

mysql - 使用单人表来存储和显示相关的家庭成员

php - 负载下 PHP 与 MySQL(单独的盒子)的通信中断

java - Android Studio Sql Server 连接

mysql - 如何统计每天发给不同人的消息数量?

MySql 用 SUM() 缓慢连接结果