2012-09-04 94 views
0

我需要一些帮助。我搜索解决方案,但我没有找到一个。将多行组合成一个MySQL

我有三个表:

langs 
(int) id | (varchar) language 
    1 |  English 
    2 |  Latin 
    3 |  Esperanto 
    ... |   ... 

keys 
(int) id | (varchar) keys 
    1 |  dog 
    2 |  cat 
    ... |  ... 

value 
(int) id | (int) key_id | (int) lang_id | (varchar) value 
    1 |  1  |  1  |  Dog 
    2 |  1  |  2  |  Canis 
    3 |  2  |  1  |  Cat 
    4 |  2  |  2  |  Felis 
    5 |  2  |  3  |  Kato 
    ... |  ...  |  ...  |  ... 

,我想要得到的结果是:

key_id | keys | English | Latin | Esperanto 
    1 | dog | Dog | Canis | NULL 
    2 | cat | Cat | Felis | Kato 
    ... | ... | ... | ... | ... 

平等key_id合并行。我知道我可以尝试使用多个JOIN,但速度很慢,我必须知道不同的langs的确切数量。

在此先感谢。 :)

+1

的[组合多个子行成一排MYSQL]可能重复(http://stackoverflow.com/questions/1067428/combine -multiple-child-rows-into-one-row-mysql) – Ryan

回答

2
SELECT CONCAT(
    ' SELECT `value`.`key_id`,' 
,  '`keys`.`keys`,' 
,   GROUP_CONCAT(
      'GROUP_CONCAT(IF(`value`.`lang_id`=',id,',`value`.`value`,NULL))' 
      , ' AS `', REPLACE(language, '`', '``'), '`' 
     ) 
, ' FROM `keys` JOIN `value` ON `value`.`key_id` = `keys`.`id`' 
, ' GROUP BY `value`.`key_id`' 
) 
INTO @sql 
FROM `langs`; 

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

请参阅[sqlfiddle](http://sqlfiddle.com/#!2/63b15/1/2)。 – eggyal

+0

这正是我需要的,但有一个问题。当我通过phpMyAdmin在本地主机数据库上重现它时,出现错误'#1243 - 给予EXECUTE'的未知预处理语句处理程序(stmt)。当我选择'@ sql'变量并运行它时,代码正在工作。我尝试了其他准备好的陈述,他们也在工作。我搜索了类似的问题,但找不到解决方案。 – suricactus

+1

@ erik1001:你在'PREPARE'语句中使用了相同的语句处理程序吗? – eggyal

0

你基本上看着一个数据透视表。这是可行的,但代码有点麻烦。

一个来源:http://www.artfulsoftware.com/infotree/queries.php#78

在比赛的最后阶段几乎所有的MySQL解决方案将需要一些要么用巫术存储过程或...硬编码返回哪种语言。

透视表是一个区域MySQL不亮中。