应用程序管理(为简单起见)用户发布的主题和消息。它的结构相当简单,并由外键强制执行:
有3个表,主题,用户和消息。
主题和用户实体通过消息实体所体现的(,)基数链接进行链接。
Message: (IdTopic,IdUser,Message)
其他实体本身并不感兴趣。
现在的问题是:
我需要返回特定用户未做出任何回复的每个主题(消息)。如您所想,数据库图由3个表组成。
如果没有复杂的查询,我该怎么做?我很确定答案很简单......但是对我来说,直接思考已经太晚了。
答案 0 :(得分:1)
SELECT t.*
FROM TOPICS t
WHERE NOT EXISTS(SELECT NULL
FROM MESSAGES m
WHERE m.idtopic = t.idtopic
AND m.isuser = @userid)
SELECT t.*
FROM TOPICS t
WHERE t.idtopic NOT (SELECT m.idtopic
FROM MESSAGES m
WHERE m.isuser = @userid)
SELECT t.*
FROM TOPICS t
LEFT JOIN MESSAGES m ON m.idtopic = t.idtopic
AND m.isuser = @userid
WHERE m.message IS NULL
如果要比较的列(idtopic,isuser)不可为空,则NOT IN和NOT EXISTS的性能优于LEFT JOIN / IS NULL。请参阅this link for details。
答案 1 :(得分:0)
根据您所描述的内容,我相信此查询会起作用。我确信它可以变得更有效率,但是我希望它能够工作并变得简单,然后你可以想出如果你想要它如何改进它。
SELECT t.IdTopics
FROM Topics t
WHERE t.IdTopics NOT IN (SELECT m.IdTopics
FROM Messages m
WHERE m.IdUser = @SpecificUser
)