sql >> Databáze >  >> RDS >> Mysql

Dotaz kontingenční tabulky MySQL s dynamickými sloupci zkracujícími hodnotu klíče

S vaším kódem je několik problémů – snížením gravitace:

  • musíte vybrat from z_tmp_admin_system_settings , nikoli from name
  • sloupec, podle kterého se má seskupit, se nazývá category , nikoli subdomain
  • protože principem dotazu je použití agregace, potřebujete agregační funkce pro vygenerované sloupce, jako je MAX(); staré verze MySQL tolerují nepoužívání agregační funkce na neagregovaných sloupcích, ale na to se nedá zvyknout
  • je dobrým zvykem obklopit názvy sloupců zpětným zaškrtnutím pro případ, že se některý z názvů střetává s vyhrazeným slovem (tak tomu není ve vašich ukázkových datech, ale pravděpodobně nejsou vyčerpávající)
  • DISTINCT pravděpodobně není potřeba, pokud jste nezduplikovali name s na kategorii (v tomto případě ji můžete přidat zpět do níže uvedeného kódu)
  • Poznámka:IFNULL(..., NULL) je ne-op

Kód:

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;

Ukázka 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. PostgreSQL:Zrušte databázi, ale DB je stále tam

  2. Ochrana injekcí MySQL a známky zranitelnosti pomocí PHP

  3. Ukládání SQL dotazů na obrazovku v Laravelu

  4. Jak spustit PostgreSQL jako službu ve Windows?