首頁  >  問答  >  主體

SQL 從主表 - 詳細表中選擇(格式化資料)

我有兩個表,分別命名為「供應商」和「聯絡人」。

聯絡人表中的資料對應於供應商表中的一筆記錄。

供應商資料

id 姓名
1 馬力
2 華為

聯絡人資料

id 供應商ID 聯繫
1 1 約翰
2 1 史密斯
3 1
4 2 美國能源部
5 2 燈芯

現在,我想做一個應傳回以下結果的查詢

id 姓名 聯繫
1 馬力 約翰、史密斯、威爾
2 華為 美國能源部,威克

或應該傳回以下結果

id 姓名 聯繫 聯繫 聯繫
1 馬力 約翰 史密斯
2 華為 美國能源部 燈芯

P粉904191507P粉904191507205 天前382

全部回覆(1)我來回復

  • P粉124890778

    P粉1248907782024-03-28 09:13:08

    您可以使用 MySQL GROUP_CONCAT 聚合函數來取得您的第一個輸出表。它自己的 ORDER BY 子句將允許您檢查行的串聯順序。

    SELECT s.ID,
           s.Name,
           GROUP_CONCAT(c.Contact ORDER BY c.id)
    FROM       Supplier s
    INNER JOIN Contact c
            ON s.ID = c.supplierId
    GROUP BY s.ID,
             s.Name

    您可以使用視窗函數 ROW_NUMBER 透過對供應商進行分割來為 Contact 表中的每一行分配排名。然後使用 IF 語句將聯絡人分成三列,該語句會檢查排名的三個可能值。 MAX 聚合函數將允許您刪除空值。

    SELECT s.ID,
           s.Name,
           MAX(IF(c.rn = 1, c.Contact, NULL)) AS Contact1,
           MAX(IF(c.rn = 2, c.Contact, NULL)) AS Contact2,
           MAX(IF(c.rn = 3, c.Contact, NULL)) AS Contact3
    FROM       Supplier s
    INNER JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY supplierId
                                            ORDER     BY id) AS rn
                FROM Contact ) c
            ON s.ID = c.supplierId
    GROUP BY s.ID,
             s.Name;

    如果每個供應商有超過三個客戶,第二個查詢可能無法運作。在這種情況下,您可以修改查詢以包含可能的最大供應商數量,或使用準備好的語句。如果您確實需要這樣的解決方案,請在下面發表評論。

    為了更好地理解,您可以在此處使用這些解決方案。第一個解決方案適用於任何 MySQL 版本,而第二個解決方案適用於 MySQL 8。

    回覆
    0
  • 取消回覆