繁体   English   中英

LEFT JOIN返回不相关的数据,该数据应为NULL

[英]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洛雷姆·伊普森警告,角色,时间段,焦点蜘蛛恐惧症,蜘蛛,维多利亚时代

DBfille示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM