为什么我只能为每个newsitem显示一个标记?

时间:2018-06-05 08:13:12

标签: php mysql

我有3张桌子,其中2张有很多关系。第三个是联结表。

newsitem:
id    content
1     "content1"
2     "this is content2"


newsitem_tags:
newsitem_id  | tag_id
   1         |   1
   1         |   2

tags
id   |  name
 1   |  "Computer"
 2   |  "Health"

我有更多条目,但这只是一个例子。

我有一个页面,其中我显示所有newsitems标签"计算机"使用此查询:

      $sql = "SELECT newsitem.content,
      newsitem.title,
      newsitem.id,
      group_concat(tag.name ORDER BY  tag.name) as tags,
      newsitem_tag.tag_id FROM newsitem
      LEFT JOIN newsitem_tag ON newsitem.id = newsitem_tag.newsitem_id
      LEFT JOIN tag ON tag.id = newsitem_tag.tag_id
      WHERE newsitem.deleted=0 and tag.deleted=0 and newsitem_tag.tag_id=1";

我在页面上显示的每个新网站都有多个标签。我试着用这个php代码在每个新闻项目中显示标签:

$result= $conn->query($sql);
   while($row = $result->fetch_assoc()) {
<?php echo $row["tags"] ?></h6>
}
事情是这样的。所有正确的新闻项目都会显示标签&#34; computer&#34;。但新闻项目只显示一个标签:&#34;计算机&#34;。正如您所看到的,一些newsitems确实有2个或更多标签。

为什么没有显示其余的标签?

1 个答案:

答案 0 :(得分:0)

最有可能的是,您可以通过将WHERE子句中的逻辑移动到ON子句来缓解此问题:

SELECT
    newsitem.content,
    newsitem.title,
    newsitem.id,
    GROUP_CONCAT(tag.name ORDER BY tag.name) AS tags,
    newsitem_tag.tag_id
FROM newsitem
LEFT JOIN newsitem_tag
    ON newsitem.id = newsitem_tag.newsitem_id AND newsitem_tag.tag_id = 1
LEFT JOIN tag
    ON tag.id = newsitem_tag.tag_id AND tag.deleted = 0
WHERE
    newsitem.deleted = 0;

如果这样做,则意味着您的一些WHERE逻辑过滤掉了整个记录。请注意,我们可以在newsitem.deleted子句中对WHERE进行检查,因为无论我们在何处放置记录,都将过滤掉记录。