【背景】
项目中遇到的需求,简单描述就像下图这样,将一对多转为一对一方便展示
数据类似这样:
我理想中的查询结果:
【遇到的问题】
遇到的最麻烦的问题就是打分项数量不确定,另外百度了半天也没查出什么可实现方式
【最终实现结果】
【解决过程】
表数据:
(1).使用 CONCAT_WS( )
1、功能:指定分隔符并将多个字符串连接成一个字符串
2、语法:concat_ws(separator, str1, str2, ...)
3、说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
首先处理评价表,使用 CONCAT_WS( )
函数将两个字段相连
select pei_app,CONCAT_WS(':',pei_xmname,pei_fenshu) as 配送分 from peisongfen;
(2). 使用 GROUP_CONCAT()
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
3、说明:通过使用distinct
可以排除重复值;如果希望对结果中的值进行排序,可以使用order by
子句;separator
是一个字符串值,缺省为一个逗号。
使用 GROUP_CONCAT()
函数配合 GROUP BY()
函数将相同编码的数据进行联接
select pei_app,GROUP_CONCAT(CONCAT_WS(':',pei_xmname,pei_fenshu) ORDER BY pei_xmname DESC SEPARATOR ' , ') as 配送分 from peisongfen GROUP BY pei_app;
#看着不舒服?美化一下
SELECT
pei_app,
GROUP_CONCAT(
CONCAT_WS(':', pei_xmname, pei_fenshu)
ORDER BY
pei_xmname DESC SEPARATOR ' , '
) AS 配送分
FROM
peisongfen
GROUP BY
pei_app;
(3).最后 inner join
一下,搞定
# peisongfen 就是上面的图片中的表,delivery 里面有姓名、时间、编号等信息
SELECT
d.del_application,
d.del_time,
d.del_main_name,
p.`配送分`
FROM
delivery AS d
INNER JOIN (
SELECT
pei_app,
GROUP_CONCAT(
CONCAT_WS(':', pei_xmname, pei_fenshu) SEPARATOR ' , '
) AS 配送分
FROM
peisongfen
GROUP BY
pei_app
) AS p ON d.del_application = p.pei_app