Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql wybierz dynamiczne wartości wierszy jako nazwy kolumn, inną kolumnę jako wartość

W przeciwieństwie do niektórych innych RDBMS, MySQL nie ma natywnej obsługi tego rodzaju operacji przestawnych zgodnie z projektem (programiści uważają, że bardziej pasuje do prezentacji niż bazy danych, warstwy aplikacji).

Jeśli absolutnie musisz wykonać takie manipulacje w MySQL, najlepszym rozwiązaniem jest zbudowanie przygotowanej instrukcji — chociaż zamiast bawić się z CASE , prawdopodobnie użyłbym po prostu GROUP_CONCAT() funkcja:

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;

Zobacz go na sqlfiddle .

Zauważ, że wynik GROUP_CONCAT() jest ograniczona przez group_concat_max_len zmienna (domyślnie 1024 bajty:mało prawdopodobne, że nie ma tu znaczenia, chyba że masz bardzo długą name wartości).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klasy zagnieżdżone — CustomRowMapper !! To już nie problem!! - Część 1

  2. MySQL:jak uzyskać długość tekstu w kolumnie?

  3. Jak tworzyć pliki językowe Codeigniter z bazy danych?

  4. Utracono połączenie z serwerem MySQL podczas zapytania

  5. Jak oceniać partycje w MySQL?