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

MySQL - Utwórz jeden rekord z kolumny

To, o co prosisz, to w zasadzie PIVOT ale MySQL nie ma funkcji przestawnej, więc możesz ją replikować za pomocą CASE instrukcja z funkcją agregującą.

Jeśli znasz wartości, możesz na stałe zakodować rozwiązanie podobne do tego:

select id,
  max(case when component_id = 1 then data end) Email,
  max(case when component_id = 2 then data end) Firstname,
  max(case when component_id = 3 then data end) Lastname,
  max(case when component_id = 4 then data end) Phone
from yourtable
group by id;

Zobacz Skrzypce SQL z wersją demonstracyjną

Wynik:

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | [email protected] | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

Domyślam się, że masz tabelę, w której można powiązać identyfikator komponentu z nazwą, więc zapytanie może również wyglądać następująco:

select t1.id,
  max(case when t2.name = 'email' then data end) Email,
  max(case when t2.name= 'FirstName' then data end) Firstname,
  max(case when t2.name= 'LastName' then data end) Lastname,
  max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
  on t1.component_id = t2.id 
group by t1.id;

Zobacz SQL Fiddle z wersją demonstracyjną

Jeśli masz nieznaną liczbę wartości, możesz użyć przygotowanej instrukcji, aby dynamicznie wygenerować to zapytanie:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when name = ''',
      name,
      ''' then data end) AS ',
      name
    )
  ) INTO @sql
FROM component;

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
                  from yourtable t1
                  inner join component t2
                    on t1.component_id = t2.id 
                  group by t1.id');

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

Zobacz SQL Fiddle z wersją demonstracyjną

Wszystkie wersje dadzą ten sam wynik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd Dockera php_network_getaddresses

  2. jak używać sql join w mysql

  3. MYSQL Wybierz MAX Date w oświadczeniu dołączenia

  4. MySQL SELECT Zduplikowane wiersze z bazy danych OpenCarts

  5. Prawda/Fałsz kontra 0/1 w MySQL