sql >> Database >  >> RDS >> Mysql

mysql selecteer dynamische rijwaarden als kolomnamen, een andere kolom als waarde

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).




  1. Terug van Open Wereld 2013

  2. GreenDAO ondersteunt meerdere relaties tussen tabellen

  3. Teruggegeven record beperken van SQL-query in Oracle

  4. Wat is de meest aanbevolen manier om tijd op te slaan in PostgreSQL met Java?