MySQL与GROUP_CONCAT的复杂查询

时间:2014-08-16 09:30:28

标签: mysql

我正在寻找一种方法来选择这个结果:

id_item     name1       name2       name3
1           value10     value20     value30
2           -           value40     -
3           value50     value60     -

从此数据库表(此处的自定义字段到每个id_item):

id_item     Name    Value
1           name1   value10
1           name2   value20
1           name3   value30
2           name2   value40
3           name1   value50
3           name2   value60

无法解决。有办法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用此查询获取新结果:

SELECT
    id_item,
    MAX(CASE WHEN Name = 'name1' THEN value ELSE '-' END) name1,
    MAX(CASE WHEN Name = 'name2' THEN value ELSE '-' END) name2,
    MAX(CASE WHEN Name = 'name3' THEN value ELSE '-' END) name3
FROM
    your_table
GROUP BY
    id_item;

Demo

我调整了此great answer bluefeet动态生成此查询:

SET @sql = NULL;
SELECT 
    GROUP_CONCAT(DISTINCT
      'MAX(CASE WHEN e.Name = ''',
      e.Name,
      ''' THEN value ELSE ''-'' END) AS ',
      e.Name
    ) INTO @sql
FROM example e;

SET @sql = CONCAT('SELECT e.id_item
                    , ', @sql, ' 
                   from example e
                   GROUP BY e.id_item;');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Demo

答案 1 :(得分:0)

我认为你需要开发商店程序。

步骤1:找到“名称”列的不同值并存储在任何会话变量

第2步:使用while循环并生成动态查询

示例:

select * from (select A.id_item,if(A.Name='name1',A.Value,Null) as  'name1',if(A.Name='name2',A.Value,Null) as  'name2',if(A.Name='name3',A.Value,Null) as  'name3' from testtable A) group by id_item  

我希望你得到我的解释

如果你有任何查询然后在这里发表评论,那么我可以根据需要在sql小提琴中构建示例。