[英]LEFT JOIN returning non-related data where it should be NULL
我有7张桌子正在尝试合并。
发布
+------+--------+--------+-----------------------+-----------------------+-----------+---------+
| Id | commid | author | created | updated | title | content |
+------+--------+--------+-----------------------+-----------------------+-----------+---------+
| 80 | 16 | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | Lorem | Ipsum |
| 79 | 16 | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | Lorem | Ipsum |
| 78 | 16 | 7 | 2019-07-27 23:09:09 | 2019-07-27 23:09:09 | Lorem | Ipsum |
| 77 | 16 | 7 | 2019-07-27 23:08:36 | 2019-07-27 23:08:36 | Lorem | Ipsum |
| 76 | 16 | 7 | 2019-07-27 23:03:17 | 2019-07-27 23:03:17 | Lorem | Ipsum |
| 75 | 16 | 7 | 2019-07-27 22:38:48 | 2019-07-27 22:38:48 | | |
+------+--------+--------+-----------------------+-----------------------+-----------+---------+
社区
+----+----------------+
| ID | title |
+----+----------------+
| 16 | The Scary Door |
+----+----------------+
社区标签类别
+-----------+----------+
| Community | Category |
+-----------+----------+
| 16 | 5 |
+-----------+----------+
| 16 | 18 |
+-----------+----------+
| 16 | 19 |
+-----------+----------+
| 16 | 20 |
+-----------+----------+
标签类别
+-------------+----+
| category | Id |
+-------------+----+
| character | 5 |
+-------------+----+
| focus | 18 |
+-------------+----+
| warning | 19 |
+-------------+----+
| Time-period | 20 |
+-------------+----+
标签分类
+----------+-----+
| category | Tag |
+----------+-----+
| 5 | 146 |
+----------+-----+
| 19 | 147 |
+----------+-----+
| 20 | 148 |
+----------+-----+
标签
+---------------+-----+
| name | Id |
+---------------+-----+
| spider | 146 |
+---------------+-----+
| arachnophobia | 147 |
+---------------+-----+
| Victorian era | 148 |
+---------------+-----+
发布标签
+------+-----+
| post | Tag |
+------+-----+
| 80 | 146 |
+------+-----+
| 80 | 147 |
+------+-----+
| 80 | 148 |
+------+-----+
在某些表中有些帖子没有相应的信息,因此我尝试使用LEFT JOIN。 这是我一直在尝试使用的查询:
SELECT p.id, c.id as 'commid', c.title AS 'community', p.author, p.created, p.updated, tc.category, t.name AS 'tag', p.title, p.content
FROM Post p
INNER JOIN Community c
ON p.community=c.id
AND c.id=16
LEFT JOIN CommunityTagCategories cc
ON c.id=cc.community
LEFT JOIN TagCategory tc
ON cc.category=tc.id
LEFT JOIN TagCategorised ct
ON tc.id=ct.category
LEFT JOIN Tag t
ON ct.tag=t.id
LEFT JOIN PostTags pt
ON t.id=pt.tag
GROUP BY p.id, t.id
ORDER BY p.created DESC;
因为只有帖子80具有任何关联的标签,所以帖子80上的三个标签应该有三个条目,而其他没有标签的条目应该有一个条目。 像这样。 我实际上并不关心带有NULL标签的帖子的类别是什么,我只想为这些帖子写一行。
我想要的结果
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
| Id | commid | community | author | created | updated | category | tag | title | content |
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | character | spider | Lorem | Ipsum |
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | warning | arachnophobia | Lorem | Ipsum |
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | time-period | victorian era | Lorem | Ipsum |
| 79 | 16 | The Scary Door | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | | NULL | Lorem | Ipsum |
| 78 | 16 | The Scary Door | 7 | 2019-07-27 23:09:09 | 2019-07-27 23:09:09 | | NULL | Lorem | Ipsum |
| 77 | 16 | The Scary Door | 7 | 2019-07-27 23:08:36 | 2019-07-27 23:08:36 | | NULL | Lorem | Ipsum |
| 76 | 16 | The Scary Door | 7 | 2019-07-27 23:03:17 | 2019-07-27 23:03:17 | | NULL | Lorem | Ipsum |
| 75 | 16 | The Scary Door | 7 | 2019-07-27 22:38:48 | 2019-07-27 22:38:48 | | NULL | | |
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
但是,当我运行查询时,我得到24个结果,每个数据重复4行。 每个标签都包含NULL。 像这样(但在每篇文章中,不仅限于我在此处显示的两篇文章)。 它还显示了一个标签类别,该类别未与任何帖子一起使用( Focus
),我不确定为什么会这样。
实际结果
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
| Id | commid | community | author | created | updated | category | tag | title | content |
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | character | spider | Lorem | Ipsum |
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | focus | | Lorem | Ipsum |
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | warning | arachnophobia | Lorem | Ipsum |
| 80 | 16 | The Scary Door | 7 | 2019-07-27 23:11:07 | 2019-07-27 23:11:07 | time-period | victorian era | Lorem | Ipsum |
| 79 | 16 | The Scary Door | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | character | spider | Lorem | Ipsum |
| 79 | 16 | The Scary Door | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | focus | | Lorem | Ipsum |
| 79 | 16 | The Scary Door | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | warning | arachnophobia | Lorem | Ipsum |
| 79 | 16 | The Scary Door | 7 | 2019-07-27 23:09:47 | 2019-07-27 23:09:47 | time-period | victorian era | Lorem | Ipsum |
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+
问题似乎出在数据库设计上,所以我决定尝试通过创建NULL标记并为没有标记的帖子链接到该标记(以及将该NULL标记链接到该社区的随机标记类别)来解决该问题。
当我这样做时,它可以与此mysql查询一起使用:
SELECT p.id, p.title, p.content, p.author, p.created, p.updated, ct.category, t.name AS 'tag'
FROM Post p, Community c, CommunityTagCategories cc, TagCategory ct, TagCategorised tc, Tag t, PostTags pt
WHERE c.id=18 AND p.community=c.id AND c.id=cc.community AND cc.category=ct.id AND ct.id=tc.category AND tc.tag=t.id AND t.id=pt.tag AND pt.post=p.id
ORDER BY p.created DESC;
经过深思熟虑。 我提供了一个解决方案,可以为您带来理想的结果
Select
p.Id, max(p.author) author, max(p.community) community, max(p.created) created
,max(p.title) title , max(p.content) content
,GROUP_CONCAT(DISTINCT (cttc.category)) category
, GROUP_CONCAT(DISTINCT (ctatc.name)) Tag
From
Post p
inner Join Communnity c On c.Id = p.CommId
right Join (
Select cc.Community, tc.category, tc.Id
From
TagCategory tc
inner join CommunnityTagCategories cc
ON cc.Category = tc.Id) cttc
ON p.Commid = cttc.Community
Left join (
Select
p.post,t.name,ct.category
From
PostTags p
inner join Tag t ON t.Id = p.Tag
inner join TagCategorised ct ON ct.Tag = t.Id
) ctatc
ON ctatc.category = cttc.id and ctatc.post = p.id
GROUP BY p.Id;
它让你
ID作者社区创建的标题内容类别标签
75 7 The Scary Door 2019-07-27 22:38:48警告,字符,时间周期,重点
76 7 The Scary Door 2019-07-27 23:03:17洛雷姆·伊普苏姆角色,时间段,焦点,警告
77 7 The Scary Door 2019-07-27 23:08:36 Lorem Ipsum焦点,警告,角色,时间周期
78 7 The Scary Door 2019-07-27 23:09:09 Lorem Ipsum警告,字符,时间段,重点
79 7 The Scary Door 2019-07-27 23:09:47洛雷姆·伊普苏姆角色,时间周期,焦点,警告
80 7吓人的门2019-07-27 23:11:07洛雷姆·伊普森警告,角色,时间段,焦点蜘蛛恐惧症,蜘蛛,维多利亚时代
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.