In tegenstelling tot sommige andere RDBMS heeft MySQL geen native ondersteuning voor dit soort draaiende bewerkingen door ontwerp (de ontwikkelaars vinden dat het meer geschikt is voor de presentatie dan voor de database, laag van je applicatie).
Als u dergelijke manipulaties absoluut moet uitvoeren binnen MySQL, is het bouwen van een voorbereide verklaring de juiste keuze, hoewel in plaats van te rommelen met CASE
, zou ik waarschijnlijk gewoon MySQL's GROUP_CONCAT()
functie:
SELECT CONCAT(
'SELECT `table`.id', GROUP_CONCAT('
, `t_', REPLACE(name, '`', '``'), '`.value
AS `', REPLACE(name, '`', '``'), '`'
SEPARATOR ''),
' FROM `table` ', GROUP_CONCAT('
LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '`
ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
SEPARATOR ''),
' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
PREPARE stmt FROM @qry;
EXECUTE stmt;
Bekijk het op sqlfiddle .
Merk op dat het resultaat van GROUP_CONCAT()
wordt beperkt door de group_concat_max_len
variabele (standaard 1024 bytes:is hier waarschijnlijk niet relevant, tenzij je een extreem lange name
hebt waarden).