SQL 從主表 - 詳細表中選擇(格式化資料)
P粉904191507
P粉904191507 2024-03-27 22:03:16
0
1
400

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

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

供應商資料

id 姓名
1 馬力
2 華為

聯絡人資料

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

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

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

或應該傳回以下結果

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

P粉904191507
P粉904191507

全部回覆(1)
P粉124890778

您可以使用 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。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!