2017-06-23 123 views
0

結合不同的項目,我有這三個不同的表:MySQL的 - 連接三個表,並在一個單元

business包含不同公司的信息。

business 
------------------------------------------------- 
    id  registry city_id primary_activity_id 
------------------------------------------------- 
    12  24212432   1      1 
123  43143321   2      3  
432  53242123   3     431 

business_activity描述了每家公司的次要活動。

business_activity 
------------------------------------------------ 
business_secondary_activities_id  activity_id 
------------------------------------------------ 
           12    765 
          123    109 
          432    8 
           12    431 
           12    1 
          432    3 

activity

activity 
----------------------------------- 
    id  identifier  description 
----------------------------------- 
    1   24-2 construction 
    3   35-1  consultancy 
431   12-3 manufacturing 
765   23-2  electronics 
109   34-2  software 
    8   1-2   retail 

它們連接以下列方式:

  • business.id = business_activity.business_secondary_activities_id

  • business.primary_activity_id = activity.id

  • business_activity.activity_id = activity.id

我想建立只有一個表,看起來像這樣:

business 
---------------------------------------------------------------------------------------------------------------------------------------- 
    id  registry city_id primary_activity_id primary_activity_identifier secondary_activities_ids secondary_activities_identifier 
---------------------------------------------------------------------------------------------------------------------------------------- 
    12  24212432   1      1      24-2    765,431,1     23-2, 12-3, 24-2 
123  43143321   2      3      35-5      109        34-2 
432  53242123   3     431      12-3      8,3       1-2, 35-1 
---------------------------------------------------------------------------------------------------------------------------------------- 

注意,secondary_activities_id的和secondary_activity_identifier的組合在一個單元格,並用逗號分隔。

有人可以幫忙嗎?

+1

你嘗試過什麼嗎?你擺放桌子的方式使得理解數據有點困難。 –

+0

@TimBiegeleisen我想讓它更容易閱讀,我認爲最後一張表有點混亂。我只是用我想要達到的確切格式編輯它。我已經嘗試了一些東西,但是我是SQL初學者,他們沒有接近那個:/ – abutremutante

回答

1
SELECT b.id, 
     b.registry, 
     b.city_id, 
     b.primary_activity_id, 
     a1.identifier AS primary_activity_identifier, 
     GROUP_CONCAT(DISTINCT ba.activity_id ORDER BY ba.activity_id ASC SEPARATOR ', ') 
      AS secondary_activities_ids, 
     GROUP_CONCAT(DISTINCT a2.identifier ORDER BY a2.identifier ASC SEPARATOR ', ') 
      AS secondary_activities_identifier 
FROM business b 
    LEFT JOIN activity a1 ON a1.id = b.primary_activity_id 
    LEFT JOIN business_activity ba ON ba.business_secondary_activities_id = b.id 
    LEFT JOIN activity a2 ON a2.id = ba.activity_id 
GROUP BY b.id, b.registry, b.city_id, b.primary_activity_id, a1.identifier 
ORDER BY b.id 

FROM子句相當簡單。您的基地是商業ID。每個企業都有一個主要的業務活動,可能有多個(或沒有)次要活動。因此,LEFT JOIN將所有次要活動關聯起來,並且活動表連接兩次以解碼這些數字對應的內容。

此問題的關鍵是使用GROUP_CONCAT()函數。它是一個聚合函數(類似於COUNT或SUM),用於具有GROUP BY子句的查詢。它獲取該組列中的所有記錄並將它們放入單個記錄中。在這種情況下,你沒有指定你想如何分類,所以我選擇了升序。記住好的設計實踐說,這兩個領域應該至少按照相同的順序排序,以防止用戶混淆他或她正在看什麼。

+0

傑出的解決方案@SandPiper。感謝那! – abutremutante