2013-03-17 20 views
14

Powiedz, że mam dwie tabele w bazie danych MySQL.MySQL Dołącz do wielu wierszy jako kolumn

Tabela 1:

ID Name 
1  Jim 
2  Bob 

Tabela 2:

ID Place Race_Number 
1  2nd  1 
1  3rd  2 
1  4th  3 
2  1st  1 
2  2nd  2 
2  2nd  3 

Przy wyborze wierszy z bazy danych, czy jest jakiś sposób, aby dołączyć wiersze z drugiej tabeli jako kolumny do pierwszej tabeli? Obecnie używam SELECT * FROM Table1 NATURAL JOIN Table2.

This wyjścia:

ID Name Place Race_Number 
1 Jim  2nd  1 
1 Jim  3rd  2 
1 Jim  4th  3 
2 Bob  1st  1 
2 Bob  2nd  2 
2 Bob  2nd  3 

Obecnie jestem sortowania przez to w moim skrypcie PHP posortować je do tablicy. To jest ból, ponieważ muszę spojrzeć na identyfikatory i sprawdzić, czy są one takie same, a następnie odpowiednio sortować. Czuję, że istnieje sposób, aby to zrobić w MySQL, bez konieczności sortowania go w tablicy w PHP. W każdej tabeli może znajdować się nieograniczona liczba wpisów w drugiej tabeli.

Pożądany wynik od samego zapytania MySQL:

ID Name Race1 Race2 Race3 
1  Jim  2nd  3rd  4th 
2  Bob  1st  2nd  2nd 

nie mogę zrobić kolumny Race1, Race2 etc w samych tabeli, ponieważ nie może być nieograniczoną liczbę wyścigów dla każdego identyfikatora.

Dzięki za pomoc!

Odpowiedz

28

Wystarczy Ci INNER JOIN. MySQL nie ma funkcji PIVOT, ponieważ nadal można ją symulować przy użyciu funkcji CASE i MAX().

SELECT a.ID, a.NAME, 
     MAX(CASE WHEN b.Race_Number = 1 THEN b.Place ELSE NULL END) Race1, 
     MAX(CASE WHEN b.Race_Number = 2 THEN b.Place ELSE NULL END) Race2, 
     MAX(CASE WHEN b.Race_Number = 3 THEN b.Place ELSE NULL END) Race3 
FROM Table1 a 
     INNER JOIN Table2 b 
      ON a.ID = b.ID 
GROUP BY a.ID, a.Name 

Ale jeśli masz nieznaną liczbę RACE, potem DYNAMIC SQL jest o wiele bardziej korzystne.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number, 
     ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`')) 
    ) INTO @sql 
FROM Table2; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM Table1 a 
        LEFT JOIN Table2 b 
         ON ON a.ID = b.ID 
        GROUP BY a.ID, a.Name'); 

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

Niesamowite, dziękuję bardzo !! –

+2

serdecznie dziękuję ': D' –

+0

dzięki .. dynamiczna kwerenda sql pomógł mi rozwiązać mój problem .. – Lucky

Powiązane problemy