选择mysql,其中左连接的值不同

时间:2014-05-12 12:08:29

标签: mysql sql

每次触发对邮件的删除操作时,我都有一个表messages和一个表deleted_messages,而是删除我在deleted_messages表上创建新记录的记录。然后,我想检索deleted_messages上没有删除邮件的邮件。

ps :我不在这里使用软删除,因为很多用户可以为自己删除邮件,但不能为其他用户删除

我的架构:

用户表

id | name 

消息表

id | user_id | message

deleted_messages

id | message_id | user_id

我试图执行以获取用户1的所有消息而没有删除消息的查询如下,但它返回0行:

select *
from messages 
left join deleted_messages on deleted_messages.message_id = messages.id
where deleted_messages.user_id != 1

看看SQLFiddle它应该收到2条消息,但它会返回null。

6 个答案:

答案 0 :(得分:2)

在左连接子句中添加are条件

select *
from messages 
left join deleted_messages on deleted_messages.message_id = messages.id
and  deleted_messages.user_id = 1
where deleted_messages.message_id is  null

sqlFiddle

答案 1 :(得分:1)

你可以这样做

select *
from messages m
left join deleted_messages d on d.message_id = m.id
where 
 d.message_id IS NULL
AND m.user_id = 1

这将提供来自用户1的所有未删除的消息

Demo

使用NOT EXISTS

的其他方式
select *
from messages m
where not exists
(select 1 from deleted_messages d where d.message_id = m.id)
AND m.user_id = 1

Demo

对于性能因素,您可以在此处找到详细信息 LEFT JOIN / IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns

答案 2 :(得分:1)

试试这个:

SELECT * FROM messages m
WHERE m.user_id = 1
AND NOT EXISTS (SELECT * FROM deleted_messages dm where dm.message_id = m.id)

但如果您需要使用left join,这也应该有效:

SELECT m.*, dm.message_id FROM messages m
LEFT JOIN deleted_messages dm ON dm.message_id = m.message_id
WHERE m.user_id = 1
AND message_id IS NULL

答案 3 :(得分:1)

这里的技巧是将条件移动到 join 条件,并在where where子句中查找错过的连接:

select messages.*
from messages 
left join deleted_messages on deleted_messages.message_id = messages.id
and deleted_messages.user_id != 1 -- condition here still allows left join
where deleted_messages.user_id is null -- filters out hits 

请参阅SQL Fiddle

答案 4 :(得分:0)

试试这个。

select * from messages left join deleted_messages on deleted_messages.user_id = messages.user_id where deleted_messages.user_id != 1

答案 5 :(得分:0)

select m.*
from messages m
left join deleted_messages dm
   on dm.message_id = m.id
where dm.user_id is null
  and m.user_id = 1