26

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などの列を作成することはできません。

助けてくれてありがとう!

4

1 に答える 1

50

INNER JOINあなたのニーズは十分です。MySQLには機能がありません。それでも、andfunctionを使用してMySQLをPIVOTシミュレートできます。CASEMAX()

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、aの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;
于 2013-03-17T15:51:29.567 に答える