每次触发对邮件的删除操作时,我都有一个表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。
答案 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
答案 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的所有未删除的消息
使用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
对于性能因素,您可以在此处找到详细信息 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