我有一个post / tag数据库,其中包含通常的post,tag和tag_post表。tag_post表包含tagid和postid字段。
我需要查询帖子。当我想获取具有特定标签的帖子时,必须使用联接:
... INNER JOIN tag_post ON post.id = tag_post.postid WHERE tag_post.tagid = {required_tagid}`
当我想获取包含tagIdA和tagIdB的帖子时,我必须使用两个联接(最终我觉得很满意)。
现在,我需要查询没有特定标签的帖子。如果没有想那么多,我只是改变了=到!=:
=
!=
... INNER JOIN tag_post ON post.id = tag_post.postid WHERE tag_post.tagid != {certain_tagid}`
繁荣!逻辑错误!
我确实提出了这个建议-只是在这里写逻辑:
... INNER JOIN tag_post ON post.id = tag_post.postid WHERE tag_post.postid NOT IN (SELECT postid from tag_post where tagid = {certain_tagid})
我知道这可以解决问题,但是由于我的成长方式,每当我使用子查询编写查询时,我都会感到内((无论是否合理)。
提出一个更好的方法来做到这一点?
您可以将其视为“在帖子中查找所有与标签不匹配的行(针对特定标签)”
这是左联接的教科书用例。
LEFT JOIN tag_post ON post.id = tag_post.postid AND tag_post.tagid = {required_tagid} WHERE tag_post.tag_id IS NULL
请注意,必须在联接的ON子句中具有标签ID。