Mysql表连接多行

Posted

技术标签:

【中文标题】Mysql表连接多行【英文标题】:Mysql table join with multiple rows 【发布时间】:2016-01-04 19:52:28 【问题描述】:

我有一个名为 works 的表格和一个名为 images 的表格。一个作品可以有多个图像。我在表 images 中有一个 work_id,它链接到表 worksid。 我正在尝试构建一个查询来获取所有作品以及每件作品的所有相关图像。

目前我可以获得所有作品,但图像表中只有 1 行。 这是查询。

SELECT w.id, w.title, i.imPath
FROM works w
LEFT JOIN images i ON w.id=i.work_id
WHERE w.isActive=1
GROUP BY w.id
ORDER BY w.ordr

对如何获取每项作品的图像表上的所有行有任何帮助吗?

谢谢

【问题讨论】:

【参考方案1】:

删除GROUP BY

SELECT w.id, w.title, i.imPath
FROM works w
LEFT JOIN images i ON w.id=i.work_id
WHERE w.isActive=1
ORDER BY w.ordr

这应该会给你所有你想要的行。

另一种看待它的方式:

create table works(id int, title varchar(10));
insert into works values (1, 'hello'), (2, 'world');

create table images(id int, work_id int, impath varchar(100))
insert into images values (1, 1, '/data/hello1.png'), (2, 1, '/data/hello2.png'), (3, 2, '/data/world1.png');

作品

id | title
1  | hello
2  | world

图片

id | work_id | impath
1  | 1       | /data/hello1.png
2  | 1       | /data/hello2.png
3  | 2       | /data/world1.png

在你的情况下可以翻译成这样的东西:

SELECT w.id, w.title, 
       GROUP_CONCAT(DISTINCT i.imPath ORDER BY i.imPath SEPARATOR ',') AS images
FROM works w
LEFT JOIN images i ON w.id=i.work_id
WHERE w.isActive=1
GROUP BY w.id, w.title
ORDER BY w.ordr

Result:
id | title | images
1  | hello | /data/hello1.png,/data/hello2.png
2  | world | /data/world1.png

SQLFiddle 示例:http://sqlfiddle.com/#!9/b5784c/1

要获取图像的标题,您可以执行以下操作:

SELECT w.id, w.title, 
       GROUP_CONCAT(
          DISTINCT CONCAT(i.imPath,'|',i.caption) 
          ORDER BY CONCAT(i.imPath,'|',i.caption) 
          SEPARATOR ',') AS images
FROM works w
LEFT JOIN images i ON w.id=i.work_id
WHERE w.isActive=1
GROUP BY w.id, w.title
ORDER BY w.ordr

【讨论】:

是的,你是对的,但是我想要实现的是为每个工作获取多个图像。如果我删除该组,那么我会多次获得工作数据。 我已为答案添加了扩展名。这就是你要找的@ion? 太好了!!有没有办法将图像作为数组而不是字符串?我的意思是我以后可以用 php 做到这一点,但我想用 mysql 尽可能地实现。 我不认为 MySQL 具有可与 PHP 数组相媲美的数组。我建议使用 PHP 将 group_concat'ed 字段按 ',' 拆分,以获得一个可用的 PHP 数组。您可以转换 group_concat'ed field to JSON 并将其用作 PHP 中的对象。 太棒了。最后一件事。我在图像表中还有一个名为标题的字段。我怎么也能得到它。目前,如果我将它添加到 concat 函数中,它会将它添加到 imPath 旁边。有没有办法把它作为一个单独的字段?

以上是关于Mysql表连接多行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 将多行作为列连接

MySQL 多表查询

连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复

mysql连接查询

主表连接多行从表数据转成一行并用逗号连接

SQL Server - 连接表,使多行变成一行