我正在尝试根据帖子表中的行是否在另一个表中加载多个行来加载它们。采取以下表格结构:
帖子
post_id post_title
-------------------
1 My Post
2 Another Post
post_tags
post_tag_id post_tag_name
--------------------------
1 My Tag
2 Another Tag
postTags
postTag_id postTag_tag_id postTag_post_id
------------------------------------------
1 1 1
2 2 1
毫不奇怪,post和post_tags存储帖子和标签,并且postTags连接哪些帖子具有哪些标签。
我通常要做的就是加入表:
SELECT * FROM (`posts`)
JOIN `postTags` ON (`postTag_post_id` = `post_id`)
JOIN `post_tags` ON (`post_tag_id` = `postTag_tag_id`)
然后,我将获得有关标签的信息,并且稍后可以在查询中包含其他内容,以搜索标签名称以获取搜索字词等,然后在找到与搜索字词匹配的帖子后再进行分组。
我想做的是仅从帖子中同时具有标签1和标签2的帖子中进行选择,而我无法为此制定SQL。我认为这需要在实际的JOIN中完成,而不是使用WHERE子句,因为当我在上面运行join时,我显然会返回两行,所以我不能像
WHERE post_tag_id = 1 AND post_tag_id = 2
因为每一行只会有一个post_tag_id,而且我无法检查同一行中同一列的不同值。
我试图做的是这样的:
SELECT * FROM (`posts`)
JOIN `postTags` ON (postTag_tag_id = 1 AND postTag_tag_id = 2)
JOIN `post_tags` ON (`post_tag_id` = `postTag_tag_id`)
但这在我运行它时返回0结果;我之前已经在JOINS中放置了类似的条件来进行类似的操作,并且我确定它已经接近,但是如果这不起作用,则无法完全解决。
我至少在正确的轨道上吗?希望我不会错过任何明显的东西。
谢谢。
最佳答案
您试图让postTags行同时是一回事。
您要么需要对post_tags和postTags进行两次连接,所以两者都将得到。或者,您可以说帖子可以在这两个标签之间包含任何标签,并且标签总数必须等于两个(假设一个帖子不能多次与同一个标签相关)。
第一种方法:
SELECT *
FROM `posts` as p
WHERE p.`post_id` IN (SELECT pt.`postTag_post_id`
FROM `postTags` as pt
WHERE pt.`postTag_tag_id` = 1)
AND p.`post_id` IN (SELECT pt.`postTag_post_id`
FROM `postTags` as pt
WHERE pt.`postTag_tag_id` = 2);
第二种方法:
SELECT *
FROM posts as p
WHERE p.post_id IN (SELECT pt.postTag_post_id
FROM (SELECT count(0) as c, pt.postTag_post_id
FROM postTags as pt
WHERE pt.postTag_tag_id IN (1, 2)
GROUP BY pt.postTag_post_id
HAVING c = 2) as pt);
我还要补充一点,如果您在第一种方法中使用IN或EXISTS,则同一帖子行将不会有多行,因为您有多个标签。这样,您以后保存一个DISTINCT会使查询变慢。
我在第二种方法中使用了一个IN,就像我惯用的规则:如果不需要显示数据,则不需要在FROM部分中进行JOIN。
关于mysql - 多行联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12129589/