我有一个帖子数据库,每个帖子都有标签。这些表分别命名为Posts
和Tags
。我还有第三个表,称为Posts_Tags
它维护这两个表之间的多对多关系。
为了做到这一点,我的帖子和我的标签表都有一个id
列。Posts_Tags
因此,我的表同时具有存储映射的 apostid
和tagid
column。
例如,我正在查询标题中带有“class”一词的所有帖子。我可以用这个查询轻松地做到这一点:
SELECT * FROM Posts WHERE title LIKE '%{class}%'
但是,现在我想查询标题中不仅有“class”,而且还带有“Java”标签的所有帖子。我可以在两个单独的查询中执行此操作,首先获取 Java 标记的 id:
SELECT id FROM Tags WHERE name='Java'
然后我可以将它插入到我的第一个查询中,如下所示:
SELECT Posts.*
FROM Posts
INNER JOIN Posts_Tags
ON Posts.id=Posts_Tags.postid
WHERE Posts_Tags.tagid='$java_tag_id'
AND title LIKE '%{class}%'
但是,我知道我可以在一个查询中做到这一点,我只是不知道怎么做。当只做一个连接时,我仍然需要考虑很多关于连接的问题,而在同一个查询中执行多个连接让我头晕目眩。我应该如何构造我的查询来执行这个操作?