【发布时间】: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