2013-10-19 48 views
1

如何加入以下兩個視圖?我自己嘗試過,但他們總是打破,並顯示重複的數據。我能想到的唯一工作是創建兩個視圖,然後是第三個視圖來加入這兩個視圖。問題是,對於我的應用程序,我將有大約10個視圖,這是不高效,也沒有正確設計。SQL如何將這三個視圖合併爲一個?

視圖1

SELECT e.id, e.name, GROUP_CONCAT(email SEPARATOR ', ') AS array_emails 
FROM entity AS e 
LEFT JOIN emails ON e.id=emails.entity_id 
GROUP BY id; 

視圖2

SELECT e.id, e.name, GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites 
FROM entity AS e 
LEFT JOIN web_sites ON e.id=web_sites.entity_id 
GROUP BY id 

視圖3(此視圖聯接視圖1和2一起)

SELECT e.id, e.name, view_web_sites.array_web_sites, view_emails.array_emails 
FROM entity AS e 
LEFT JOIN view_web_sites ON e.id=view_web_sites.id 
LEFT JOIN view_emails ON e.id=view_emails.id 
GROUP BY id 

這是我原來的看法,它沒有正常工作。這些值會重複。

原始 - 碎視圖 SELECT e.id,e.name,GROUP_CONCAT(電子郵件分離器 ' ')如電子郵件, GROUP_CONCAT(WEB_SITE分離器',')AS web_sites 從實體爲E LEFT JOIN電子郵件ON e.id = emails.entity_id LEFT JOIN web_sites ON e.id = web_sites.entity_id GROUP BY id;

編輯: 我已經在select語句中探索了獨特的參數,這非常有用。然而,在一張表中我有一個二進制列,不同的參數「擦除」這個值,使列無效。對此有何建議?

編輯#2(修正): 我設法解決任何人可能面臨類似問題的問題。

SELECT entity.id, entity.name, 
(SELECT GROUP_CONCAT(emails.email) FROM emails WHERE entity.id=emails.entity_id) AS emails_array, 
(SELECT GROUP_CONCAT(web_sites.web_site) FROM web_sites WHERE 
entity.id=web_sites.entity_id) AS websites_array 
FROM entity 
ORDER BY id 

回答

0
SELECT e.id, 
     e.name, 
     GROUP_CONCAT(DISTINCT m.email SEPARATOR ', ') AS array_emails, 
     GROUP_CONCAT(DISTINCT w.web_site SEPARATOR ', ') AS array_web_sites 
FROM entity AS e 
    LEFT JOIN emails AS m ON e.id = m.entity_id 
    LEFT JOIN web_sites AS w ON e.id = w.entity_id 
GROUP by e.id ; 

如果您使用的意見,你並不需要最後GROUP BY id

SELECT e.id, 
     e.name, 
     m.array_emails, 
     w.array_web_sites 
FROM entity AS e 
    LEFT JOIN view_emails AS m ON e.id = m.entity_id 
    LEFT JOIN view_web_sites AS w ON e.id = w.entity_id ; 

如果你不想嵌套的意見,你可以使用一個查詢寫它 - 通過刪除派生表中的連接來簡化它:

SELECT e.id, 
     e.name, 
     m.array_emails, 
     w.array_web_sites 
FROM entity AS e 
    LEFT JOIN 
    (SELECT entity_id, 
      GROUP_CONCAT(email SEPARATOR ', ') AS array_emails 
     FROM emails 
     GROUP BY entity_id 
    ) AS m ON e.id = m.entity_id 
    LEFT JOIN 
    (SELECT entity_id, 
      GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites 
     FROM web_sites 
     GROUP BY entity_id 
    ) AS w ON e.id = w.entity_id ; 
+0

感謝您的回覆,我已經測試了不同的參數。它工作的很好,但唯一的問題是,我有一個表中有一個二進制值的列,當我使用不同它會被「擦除」。 有什麼建議嗎? – Gregor

+0

「擦除」是什麼意思? –

+0

以及可以說我有4條記錄,其中具有二進制值的列, 記錄1:0 記錄2:0 記錄3:0 記錄4:1 與GROUP_CONCAT沿不同參數()將其轉換到0:1。而不是0,0,0,1(由於不同的arg。) 但問題是,當我沒有明確的價值,我的輸出是0,0,0,1,0, 0,0,1,0,0,0,1(循環3次,因爲我還有其他表格),這就是爲什麼對我有用的唯一解決方案是爲每個表格創建一個視圖,然後將所有在最後的觀點中再次一起看待這些觀點。 – Gregor