2017-09-26 72 views
1

我的表有以下模式: wp_careers enter image description here一次可以加入多對多,一對多嗎?

wp_locations enter image description here

wp_careers_locations enter image description here

wp_educations enter image description here

生涯申請人可應用於許多地方,並有許多教育rec ORDS。

想要的結果是從wp_careers獲取所有記錄,並將應用的位置作爲位置字段進行分組,並將所有教育記錄(wp_educations)作爲附加到申請人的數組。

現在我知道如何加入多對多關係和組的位置:

SELECT c.*, GROUP_CONCAT(l.name) as locations 
    FROM wp_careers c 
    JOIN wp_careers_locations cl ON c.id = cl.career_id 
    JOIN wp_locations l ON cl.location_id = l.id 
    GROUP BY c.id 

但我不知道如何擴展此查詢到包括教育記錄。

回答

1

一種方法是隻重新加入:

SELECT c.*, GROUP_CONCAT(DISTINCT l.name) as locations, 
    GROUP_CONCAT(DISTINCT e.institute) AS edu_institutes 
FROM wp_careers c 
LEFT JOIN wp_careers_locations cl ON c.id = cl.career_id 
LEFT JOIN wp_locations l ON cl.location_id = l.id 
LEFT JOIN wp_educations e ON c.id = e.career_id 
GROUP BY c.id 

但這可能造成Cartesian product,因爲它會在不經意間加入每一個位置的每一個教育。所以如果你有一個職業的三個地點和兩個教育,它會產生3x2 = 6行,當你沒有想到它。我試圖用DISTINCT來彌補這一點,因此每個GROUP_CONCAT()中的名稱列表將消除重複項。

但老實說,我寧願運行兩個查詢。一個用於位置,另一個用於教育。這將避免笛卡爾產品。 MySQL不是很弱,不能處理額外的查詢,而且實際上可能比執行DISTINCT操作更便宜。


回覆您的評論:

你想限制在教育職業生涯查詢只對那些至少有一個位置?

你可以用半聯接做到這一點:

SELECT c.*, GROUP_CONCAT(e.institute) AS edu_institutes 
FROM wp_careers c 
JOIN wp_educations e ON c.id = e.career_id 
WHERE c.id IN (SELECT career_id FROM wp_career_locations) 
GROUP BY c.id 

即使有可能是相匹配的相應的c.id wp_career_locations多行,它不會導致一個笛卡爾乘積。

+0

要運行2個查詢,我如何才能獲得與我擁有的職業ID匹配的wp_educations記錄。例如,如果根據某些條件(如LIMIT 15)從wp_careers檢索到15條記錄,那麼我只想要檢索與wp_careers相關的wp_educations記錄。 –