表格结构
Table 1
-------------
code | name
-------------
1 | abc
2 | xyz
Table 2
-------------------------------
code | table1_code | data
-------------------------------
1 | 1 | a
2 | 1 | b
3 | 1 | c
4 | 1 | d
5 | 1 | e
6 | 2 | f
7 | 2 | g
现在预期结果:
结果
table1_code | name | data_col1 | data_col2 | data_col3
------------------------------------------------------------------
1 abc a b c
2 xyz f g -
到目前为止我尝试了什么
SELECT a.code AS table1_code,
a.NAME,
b.data_col
FROM table1 AS a
LEFT OUTER JOIN table2 AS b
ON a.code = b.table1_code
请帮助我改变查询以获得以上输出,
我想要数据最多3列。
答案 0 :(得分:0)
要执行此操作,您需要一种方法来确定每组中前三项应该是什么。执行此操作的方法是添加为每个新组重新启动的行号。这在任何支持窗口函数的数据库中都很容易,但MySQL不会因为你必须使用用户定义的变量来进行排名而变得有点复杂。
在下面的查询中,数据的排名是在用作源的派生表中完成的,然后执行条件聚合,以便每组获得一行:
SELECT
code,
name,
MAX(CASE WHEN rank = 1 THEN data END) data_col1,
MAX(CASE WHEN rank = 2 THEN data END) data_col2,
MAX(CASE WHEN rank = 3 THEN data END) data_col3
FROM (
SELECT
a.code,
a.name,
b.data,
(
CASE a.name
WHEN @grp THEN @row := @row + 1
ELSE @row := 1 AND @grp := a.name
END
) + 1 AS rank
FROM table1 AS a
LEFT OUTER JOIN table2 AS b ON a.code = b.table1_code
, (SELECT @row := 0, @grp := '') r
ORDER BY a.code, a.name asc
) src
GROUP BY code, name;