我需要一些帮助。我用谷歌搜索解决方案,但我没找到。
我有三张桌子:
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
的确切数量。
提前致谢。 :)
答案 0 :(得分: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 :(得分:0)
您实际上是在查看数据透视表。它是可行的,虽然代码有点麻烦。
一个来源:http://www.artfulsoftware.com/infotree/queries.php#78
最后,虽然大多数mysql解决方案都需要一些带存储过程的魔法,或者......硬编码你返回的语言。
数据透视表是mysql不会发光的一个领域。