MySQLデータベースに2つのテーブルがあるとします。
表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
データベースから行を選択するときに、2番目のテーブルの行を列として最初のテーブルに結合する方法はありますか?現在、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スクリプトでこれを並べ替えて配列に並べ替えています。これは、IDを調べて同じかどうかを確認してから並べ替える必要があるため、面倒です。したがって、PHPで配列に並べ替えることなく、MySQLでこれを正しく行う方法があるように感じます。IDごとに2番目のテーブルに無制限の数のエントリが存在する可能性があります。
MySQLクエリからの望ましい結果は次のとおりです。
ID Name Race1 Race2 Race3
1 Jim 2nd 3rd 4th
2 Bob 1st 2nd 2nd
IDごとにレースの数に制限がないため、テーブル自体にRace1、Race2などの列を作成できません。
助けてくれてありがとう!
_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;
_