mySQL查询具有多个键的表

时间:2014-03-06 20:54:05

标签: mysql sql

我有一个包含不同行的表,每行对于相同的项都有不同的键。我想创建一个mySQL查询,将不同的键作为列放在新表中。 原表:

id  locale  key         value
1   en  description Great trip around cordoba's jklfjklfsjfdsk sdjk ds...
1   en  highlights_1    horse back riding
1   en  highlights_2    Asado
1   en  highlights_3    Free drinks

请求结果:

id  description        highlights_1        highlights_2       highlights_3    ...
1   Great trip ar...   horse back riding   Asado              Free drinks

我所做的查询(在新表中只获得一个键/列是......)

SELECT activity.id,
  activity_multilingual_fields_text.value AS activitydescription
  FROM activity
  LEFT JOIN activity_multilingual_fields_text ON activity_multilingual_fields_text.id = activity.id  AND activity_multilingual_fields_text.locale = "en" 
GROUP BY activity.id

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这最终并不困难,因为key存在固定且有限数量的可能值。您不需要动态构造SQL,它可以是硬编码的。

一般模式是附加CASE语句,如果value的值与预定义字符串匹配,则返回key列。这需要针对每个可能的key进行。

这导致5个单独的行,但大多数是NULL。然后,将每个CASE包装在MAX()聚合内部,该聚合丢弃NULL并将每个聚合成一行。必须在所选的其他列上应用GROUP BY

SELECT
  activity.id,
  MAX(CASE WHEN lf.`key` = 'description' THEN lf.value ELSE NULL END) AS `description`,
  MAX(CASE WHEN lf.`key` = 'highlights_1' THEN lf.value ELSE NULL END) AS `highlights_1`,
  MAX(CASE WHEN lf.`key` = 'highlights_2' THEN lf.value ELSE NULL END) AS `highlights_2`,
  MAX(CASE WHEN lf.`key` = 'highlights_3' THEN lf.value ELSE NULL END) AS `highlights_3`,
  MAX(CASE WHEN lf.`key` = 'highlights_4' THEN lf.value ELSE NULL END) AS `highlights_4`
FROM 
  activity
  LEFT JOIN activity_multilingual_fields_text lf
    ON lf.id = activity.id
       AND lf.locale = "en" 
GROUP BY activity.id

以下是演示:http://sqlfiddle.com/#!2/bc028/3

答案 1 :(得分:0)

GROUP BY activity.id将在id列中将结果聚合为每个唯一值的1个结果记录。这可能就是为什么到目前为止您所拥有的代码只能在新表中获得一个键/列。除此之外,这个例子似乎并不完整。你在哪里创建表?您正在使用您用于执行查询的任何服务器端语言吗?