我有一个 SQL 查询,它生成以下内容:
col1 | col2 | col3
=====================
item1 | key1 | value1
---------------------
item1 | key2 | value2
这是查询:
SELECT t1.col1, t2.col2, t2.col3
FROM table1 t1
JOIN table2 t2 ON t1.id = t1.table1_id
表1数据:
id | col1
=========
1 | item1
2 | item1
表2数据:
table1_id | col2 | col3
=====================
1 | key1 | item1
1 | key2 | item2
2 | key1 | item1
2 | key2 | item2
2 | key3 | item3
行数是动态的,因此在某些情况下我还可以获得以下信息:
col1 | col2 | col3
=====================
item2 | key1 | value1
---------------------
item2 | key2 | value2
---------------------
item2 | key3 | value3
我希望第一个查询结束的方式如下:
col1 | key1 | key2
=======================
item1 | value1 | value2
第二个查询是:
col1 | key1 | key2 | key3
==============================
item2 | value1 | value2 | value3
有没有一种简单的方法可以做到这一点而不会过度复杂化?我正在使用 MariaDB。
我想你想要这个查询:
SET SESSION group_concat_max_len = 1000000;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN t2.col2= ''',
t2.col2,
''' THEN t2.col3 END) AS ',
t2.col2
)
)INTO @sql
FROM
t1
JOIN t2 ON t1.id = t2.table1_id
;
SET @sql=CONCAT('SELECT t1.col1, ',@sql,' FROM
t1
JOIN t2 ON t1.id = t2.table1_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
FIDDLE http://sqlfiddle.com/#!9/8307b/1
如果您有不同的项目,您可能想按项目分组
FIDDLE http://sqlfiddle.com/#!9/ba186/2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)