mysql - Mysql Join - 问答标签系统 - 如何修改以显示标签和答案计数,即使是没有交叉引用的标签
问题描述
我有一个使用标签的问答计划。
我有一个使用 3 个表的 Mysql 连接查询。
TAGS:tag_id、tag_name(与问题相关的原始标签)
TAGS_X:tag_id、question_id(对问题的交叉引用标签)
POSTS:question_id + 其他列(问题的答案)
问题:question_id + 其他列,但未在此 SQL 连接中使用
TAGS 表是标签名称的原始表。问题有标签,答案会根据问题 ID 发布在 POSTS 上。查询的目的是计算与标签关联的答案数量(间接通过问题 ID)。
一些标签:
是新的,还没有交叉引用任何东西。想要列出 0 的 tag_id、tag_name、answer_count。[不列出]
与问题相关联,但在 POSTS 中没有答案,并且 question_id 不会出现在 POSTS 中,因此,答案计数将为 0 [工作正常]
与一个或多个问题相关联,在 POSTS 中有答案,并且会有计数 [WORKS OK]
下面的 SQL 代码适用于情况 #2 和 #3。是否有一种简单的方法来修改下面的代码以使其也适用于情况#1,因此也列出了没有交叉引用和没有答案的标签?
$sql = "SELECT tags.tag_name AS tag_name, tags_x.tag_id AS tag_id, count(posts.question_id) as answer_count FROM tags_x
INNER JOIN tags
ON tags.tag_id = tags_x.tag_id
LEFT JOIN posts
ON tags_x.question_id = posts.question_id
GROUP BY tags_x.tag_id";
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(pdo::FETCH_ASSOC);
foreach($result as $row){
$tag_id = $row['tag_id'];
$tag_name = $row['tag_name'];
$answer_count = $row['answer_count'];
echo $tag_id.' - '.$tag_name.' - '.$answer_count.'<br>';//for testing
}
[编辑]
尝试左加入:
SELECT tags.tag_name AS tag_name, tags_x.tag_id AS tag_id, count(posts.question_id) as answer_count FROM tags
LEFT JOIN tags_x
根据 Akina 在下面的回答中的建议,此修改有效!
解决方案
SELECT tag_id, tags.tag_name, COUNT(posts.question_id) AS answer_count
FROM tags
LEFT JOIN tags_x USING (tag_id)
LEFT JOIN posts USING (question_id)
GROUP BY tag_id, tags.tag_name