首页 > 解决方案 > Mysql Join - 问答标签系统 - 如何修改以显示标签和答案计数,即使是没有交叉引用的标签

问题描述

我有一个使用标签的问答计划。

我有一个使用 3 个表的 Mysql 连接查询。

  1. TAGS:tag_id、tag_name(与问题相关的原始标签)

  2. TAGS_X:tag_id、question_id(对问题的交叉引用标签)

  3. POSTS:question_id + 其他列(问题的答案)

  4. 问题:question_id + 其他列,但未在此 SQL 连接中使用

TAGS 表是标签名称的原始表。问题有标签,答案会根据问题 ID 发布在 POSTS 上。查询的目的是计算与标签关联的答案数量(间接通过问题 ID)。

一些标签:

  1. 是新的,还没有交叉引用任何东西。想要列出 0 的 tag_id、tag_name、answer_count。[不列出]

  2. 与问题相关联,但在 POSTS 中没有答案,并且 question_id 不会出现在 POSTS 中,因此,答案计数将为 0 [工作正常]

  3. 与一个或多个问题相关联,在 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 在下面的回答中的建议,此修改有效!

标签: mysqlsqljoin

解决方案


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

推荐阅读