2012-09-04 2 views
0

도움이 필요합니다. 나는 해결책을 찾기 위해 googled했다. 그러나 나는 것을 발견하지 않았다.여러 행을 하나의 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

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

병합 행을. 나는 여러 개의 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을 통해 내 로컬 호스트 DB에 복사 할 때'# 1243 - 알 수없는 준비된 명령문 처리기 (stmt)가 EXECUTE에게 주어짐 '오류가 발생합니다. @sql 변수를 선택하여 실행하면 코드가 작동합니다. 나는 다른 준비된 진술과 함께 노력했고, 그들은 또한 일하고있다. 비슷한 문제가 있어도 봤지만 해결책을 찾지 못했습니다. – suricactus

+1

@ erik1001 : PREPARE 문에서 동일한 명령문 처리기를 사용하고 있습니까? – eggyal

0

본질적으로 피벗 테이블을보고 있습니다. 그것은 코드가 조금 성 가시지만, 가능합니다.

하나의 소스 : 대부분의 어떤 MySQL의 솔루션은 일부 저장 프로 시저와 마법 또는 중 하나를 필요로하지만 결국 http://www.artfulsoftware.com/infotree/queries.php#78

... 당신이 반환하는 언어를 하드 코딩.

피벗 테이블은 MySQL이 빛나는하지 않는 한 지역이다.

관련 문제