2013-03-17 3 views
14

Скажем, у меня есть две таблицы в базе данных MySQL.MySQL Присоединиться к нескольким строкам в виде столбцов

Таблица 1:

ID Name 
1  Jim 
2  Bob 

Таблица 2:

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

При выборе строки из базы данных, есть ли способ, чтобы присоединиться строки из второй таблицы в качестве столбцов первой таблицы? В настоящее время я использую SELECT * FROM Table1 NATURAL JOIN Table2.

Это выходы:

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 

В настоящее время я сортировочные через это в моем PHP скрипт для сортировки в массив. Это боль, поскольку я должен посмотреть на идентификаторы и посмотреть, совпадают ли они, а затем сортировать соответственно. Я чувствую, что есть способ сделать это прямо в MySQL, без необходимости сортировать его в массив в PHP. Для каждого идентификатора может быть неограниченное количество записей во второй таблице.

Желаемый результат прямо из запроса MySQL является:

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

Я не могу сделать столбцы для Race1, Race2 и т.д. в таблице сами, потому что может быть неограниченное количество гонок для каждого идентификатора.

Спасибо за помощь!

ответ

28

INNER JOIN будет достаточным для ваших нужд. MySQL не имеет функции PIVOT, вы все еще можете имитировать ее с помощью CASE и 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 

Но если у вас есть неизвестное число RACE, то DYNAMIC SQL гораздо более предпочтительным.

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

Удивительный, большое спасибо! –

+2

приветствуется ': D' –

+0

спасибо .. динамическая часть sql-запроса помогла мне решить мою проблему. – Lucky

Смежные вопросы