我有一个包含不同行的表,每行对于相同的项都有不同的键。我想创建一个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
感谢您的帮助!
答案 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
答案 1 :(得分:0)
GROUP BY activity.id将在id列中将结果聚合为每个唯一值的1个结果记录。这可能就是为什么到目前为止您所拥有的代码只能在新表中获得一个键/列。除此之外,这个例子似乎并不完整。你在哪里创建表?您正在使用您用于执行查询的任何服务器端语言吗?