【问题标题】:LEFT JOIN returning non-related data where it should be NULLLEFT JOIN 返回不相关的数据,它应该是 NULL
【发布时间】:2019-08-08 18:22:07
【问题描述】:

我有 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;

由于只有 post 80 有任何关联的标签,因此 post 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    |
+----+--------+----------------+--------+---------------------+---------------------+-------------+---------------+-------+----------+

【问题讨论】:

  • 不确定这是否相关,但您是否尝试过通过 WHERE 子句而不是 Inner Join 过滤社区 ID?
  • 不可能重新构造您的语句,您的列与您给定的表不对应。这就是我得到的选择 pt.post,p.Id,c.Community, p.misc,c.title,tcd.Tag, t.name from posts p inner join Communnity c on p.community = c.Community left join CommunnityTagCategories ctc on p.community = ctc.Community Left Join TagCategory tc on ctc.Category = tc.id Left Join TagCategorised tcd ON tcd.category = tc.ID Left join Tag t ON t.Id = tcd.Tag Left join PostTags pt ON pt.Tag = t.Id GROUP BY p.id, t.id;
  • 我尝试将 WHERE c.id=16 放在最后的 GROUP BY 部分之前,但它给了我相同的 24 个结果。
  • @nbk 抱歉,我意识到我在社区表 (community->id) 中写错了一个列名。 misc 列只是 Post 表中的各个列(作者、创建、更新、标题、内容等,我刚刚截断为 misc。我尝试了您的查询,您将 Community 的 LEFT JOIN 更改为 CommunityTagCategories ON p.community= ctc.id 而不是 c.id=ctc.id 但它给了我相同的结果。
  • 如果你能告诉我你得到了什么,请在 dbfiddle 中告诉我dbfiddle.uk/…

标签: mysql


【解决方案1】:

经过深思熟虑。我提供了一个解决方案,可以让您如愿以偿 结果

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 可怕的门 2019-07-27 22:38:48 警告,字符,时间段,焦点
76 7 可怕的门 2019-07-27 23:03:17 Lorem Ipsum 角色,时间段,焦点,警告
77 7 可怕的门 2019-07-27 23:08:36 Lorem Ipsum 焦点,警告,字符,时间段
78 7 可怕的门 2019-07-27 23:09:09 Lorem Ipsum 警告,字符,时间段,焦点
79 7 可怕的门 2019-07-27 23:09:47 Lorem Ipsum 角色,时间段,焦点,警告
80 7 可怕的门 2019-07-27 23:11:07 Lorem Ipsum 警告,角色,时间段,焦点蜘蛛恐惧症,蜘蛛,维多利亚时代

DBfille example

【讨论】:

  • 哇,这真是太好了!谢谢你。它需要一些更改 PHP 代码才能使用这种新格式,但它似乎得到了我想要的一切。再次感谢:)
【解决方案2】:

问题似乎出在数据库设计上,所以我决定尝试通过创建一个 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2021-02-09
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多