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

Zapytanie tabeli przestawnej MySQL z dynamicznymi kolumnami obcinającymi wartość klucza

Istnieje kilka problemów z twoim kodem - poprzez zmniejszenie grawitacji:

  • musisz wybrać from z_tmp_admin_system_settings , a nie from name
  • kolumna do grupowania nazywa się category , a nie subdomain
  • ponieważ zasadą zapytania jest użycie agregacji, potrzebujesz funkcji agregujących dla generowanych kolumn, takich jak MAX(); stare wersje MySQL tolerują nieużywanie funkcji agregującej na niezagregowanych kolumnach, ale nie jest to coś, do czego należy się przyzwyczaić
  • Dobrą praktyką jest otaczanie nazw kolumn znakami wstecznymi na wypadek, gdyby jedna z nazw kolidowała ze słowem zastrzeżonym (nie dotyczy to przykładowych danych, ale prawdopodobnie nie są one wyczerpujące)
  • DISTINCT prawdopodobnie nie jest potrzebna, chyba że zduplikowałeś name s na kategorię (w tym przypadku możesz dodać go z powrotem do poniższego kodu)
  • Uwaga boczna:IFNULL(..., NULL) jest zakazem

Kod:

SET SESSION group_concat_max_len = 100000;
SET @sql = '';

SELECT GROUP_CONCAT(
    CONCAT('MAX(IF(z_tmp_admin_system_settings.name = ''', name, ''', value, NULL)) AS `', name, '`')
)
INTO @sql
FROM z_tmp_admin_system_settings;
SET @sql = CONCAT(
    'SELECT category, ', 
    @sql, 
    ' FROM z_tmp_admin_system_settings GROUP BY category'
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Demo na DB Fiddle :

| category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
| -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
| acme     | 0   | today               | 1                           | 1                    |                              |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problemy z typem treści podczas ładowania urządzenia w Django

  2. Czy lepiej użyć pustej wartości jako „” czy jako NULL?

  3. pdo lastInsertId zwraca zero (0)

  4. Klucz obcy MySQL, aby umożliwić NULL?

  5. Identyfikatory MySQL Select, które występują w różnych wierszach z wieloma określonymi wartościami dla kolumny