2012-09-04 133 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不亮中。