mysql - 连接出现多个匹配的 2 个表,并为多个值创建文本列
问题描述
如何创建一个text
名为 columnType的视图fileTags
,其值是fileTag
. 与 匹配的tag
列。? (此外,这个视图最终会拥有比这个更多的连接。)imgId
file
imgId
我的file
桌子
+-------+----------+
| imgId | filename |
+-------+----------+
| 10 | dog.jpg |
+-------+----------+
| 20 | cat.jpg |
+-------+----------+
| 30 | bird.jpg |
+-------+----------+
我的fileTag
桌子
+----+--------+----------+
| id | tag | imgId |
+----+--------+----------+
| 1 | fur | 10 |
+----+--------+----------+
| 2 | paw | 10 |
+----+--------+----------+
| 3 | leash | 10 |
+----+--------+----------+
| 4 | feline | 20 |
+----+--------+----------+
我的预期目标。一个getFiles
视图(通过 imgId 加入并创建一个包含所有标签的文本列)
+-------+----------+-----------------------+
| imgId | filename | fileTags |
+-------+----------+-----------------------+
| 10 | dog.jpg | ["fur","paw","leash"] |
+-------+----------+-----------------------+
| 20 | cat.jpg | ["feline","litter"] |
+-------+----------+-----------------------+
| 30 | bird.jpg | ["beak","wings"] |
+-------+----------+-----------------------+
我的观点设计尝试
SELECT
`file`.`imgId` AS `imgId`,
GROUP_CONCAT(`fileTag`.`tag`) AS `tags`
FROM
(
`file`
JOIN `fileTag` ON(
(
`file`.`imgId` = `fileTag`.`imgId`
)
)
)
GROUP BY `fileTag`.`imgId`
我的问题
- 如果我执行 JOIN,性能很好,但它只返回该 imgId 具有 fileTag 的行。即使它们没有fileTag,我也需要返回所有文件。
- 如果我做一个 LEFT JOIN,性能真的很差。如果我运行 EXPLAIN,我可以看到它为每个表索引了太多行。
任何帮助将不胜感激。谢谢你。
解决方案
我想你想要LEFT JOIN
:
SELECT f.imgId, GROUP_CONCAT(ft.tag) AS tags
FROM file f LEFT JOIN
filetag ft
ON f.imgId = ft.imgId
GROUP BY f.imgId;
一条评论:所有括号和反引号使查询更难编写和理解。
性能应该很好,索引在filetab(imgId, tag)
.
使用相同的索引,您可能会发现相关子查询更快:
SELECT f.imgId,
(SELECT GROUP_CONCAT(ft.tag)
FROM filetag ft
WHERE f.imgId = ft.imgId
) AS tags
FROM file f ;
这避免了外层GROUP BY
,这可能是性能上的胜利。
推荐阅读
- php - 如何在mysql datetime列中存储带有时区信息的时间?
- react-redux - 测试反应异步动作创建者 - 未定义的数据
- java - Java中具有多个类的Varargs问题
- c - 将文件内容逐行读取到矩阵中
- angular - 用另一个对象数组替换一个对象数组
- r - 在ggplot条形图中使Y轴从1而不是0开始
- powershell - Word com 对象失败
- ruby-on-rails - 如何拒绝存在特定条件的 AR 关联
- c++ - Amazon AWS Cloud 9 上的 GCC 或 Clang 版本?
- java - 你如何在 Jersey + Java 中返回来自特定索引的数组列表