mysql - 对具有多个 INNER JOIN 的多个列进行 GROUP BY
问题描述
我有一个简单的选择查询,它将 5 个表连接在一起以获取信息。我想要两个不同表上两列的不同值,而不是两列值的不同组合。
社区表
+--------+----+------------------+-----------------+------+
| title | id | shortdescription | longdescription | type |
+--------+----+------------------+-----------------+------+
| Sci-fi | 14 | Lorem ipsum | Lorem ipsum | mix |
+--------+----+------------------+-----------------+------+
社区标签类别表:
+-----------+----------+
| community | category |
+-----------+----------+
| 14 | 5 |
| 14 | 9 |
| 14 | 17 |
| 14 | 18 |
+-----------+----------+
标记类别表
+-----------+----+
| category | id |
+-----------+----+
| character | 5 |
| warning | 9 |
| mention | 17 |
| focus | 18 |
+-----------+----+
社区标签表:
+-----------+-----+
| community | tag |
+-----------+-----+
| 14 | 136 |
| 14 | 137 |
| 14 | 138 |
| 14 | 139 |
+-----------+-----+
标签表:
+--------+-----+
| name | id |
+--------+-----+
| sci-fi | 136 |
| space | 137 |
| aliens | 138 |
| future | 139 |
+--------+-----+
这是我一直在尝试的查询:
SELECT c.title, c.id, c.shortdescription, c.longdescription, c.type, tc.category, t.name AS 'tag'
FROM Community c, CommunityTagCategories cc, TagCategory tc, CommunityTags ct, Tag t
WHERE c.id=cc.community
AND cc.category=tc.id
AND ct.tag=t.id
AND c.id=ct.community
AND c.id=14;
Community 14
有4 tag
类别和 4 个标签,理想情况下我希望返回 4 个结果。但是它返回 16 个结果,因为它为我提供了标签类别和标签的所有可能组合。
我想看到的结果(来自社区表的信息因空间而被截断):
+-------------------------+--------------+-----------+
| community columns | tag category | tag |
+-------------------------+--------------+-----------+
| community info repeated | sci-fi | character |
| community info repeated | space | warning |
| community info repeated | aliens | mention |
| community info repeated | future | focus |
+-------------------------+--------------+-----------+
如果我使用"GROUP BY t.id"
它返回4 tags
,但它只返回一个重复四次的标签类别(反之亦然"GROUP BY tc.id"
)。
如果我使用逗号,"GROUP BY tc.id, t.id"
那么它16
会再次返回结果。
"GROUP BY tc.id AND t.id"
什么都不返回。
有没有办法只为 4 个标签类别和 4 个标签获取 4 行?
解决方案
如果标签和类别之间没有关系,除了在子查询中制造“行号”并将其用作连接条件之外,实际上没有办法得到你想要的东西,然后你必须处理标签多于类别的情况,或比标签更多的类别,分别(因为 MySQL 仍然没有 FULL OUTER JOIN)。
这是更好地处理数据的多个查询,然后呈现处理客户端。
推荐阅读
- nuget - 如何删除 NuGet 库
- java - JPA:父子关系合并不起作用
- google-apps-script - 使用带有 ARRAYFORMULA 的自定义 MD5 公式
- makefile - 找不到带有 scipt 的 Makefile 创建临时文件
- javascript - 如何将参数从 redux-saga 观察者发送到 AsyncFunction?
- python - 从批处理文件将参数传递给python脚本
- react-native - 如何在 nativebase 中的所有屏幕上使用通用页脚
- linux - 在 CSV 文件中,我想从 UNIX 文件的第 3 列的 10 个字符中删除前 5 个字符
- excel - VBA:CDbl 忽略逗号小数分隔符
- python - 具有少量 gpus 的多个 cpu 生产者未使用 100% 的 gpus (pytorch)