首页 > 解决方案 > 连接出现多个匹配的 2 个表,并为多个值创建文本列

问题描述

如何创建一个text名为 columnType的视图fileTags,其值是fileTag. 与 匹配的tag列。? (此外,这个视图最终会拥有比这个更多的连接。)imgIdfileimgId

我的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`

我的问题

任何帮助将不胜感激。谢谢你。

标签: mysqlsqldatabasejoin

解决方案


我想你想要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,这可能是性能上的胜利。


推荐阅读