簡體   English   中英

MySQL將多行作為列連接

[英]MySQL Join Multiple Rows as Columns

假設我在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腳本中對其進行排序,以將其排序為數組。 這是一個痛苦,因為我必須查看ID並查看它們是否相同然后進行相應排序。 我覺得有一種方法可以在MySQL中做到這一點,而無需將其排序到PHP中的數組中。 每個ID在第二個表中可以有無限數量的條目。

MySQL查詢中的所需結果是:

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

我不能在表格中為Race1,Race2等制作列,因為每個ID可以有無限數量的比賽。

謝謝你的幫助!

INNER JOIN足以滿足您的需求。 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 ,那么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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM