我有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个或更多标签。
为什么没有显示其余的标签?
答案 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
进行检查,因为无论我们在何处放置记录,都将过滤掉记录。