一種方法是隻重新加入:
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多行,它不會導致一個笛卡爾乘積。
要運行2個查詢,我如何才能獲得與我擁有的職業ID匹配的wp_educations記錄。例如,如果根據某些條件(如LIMIT 15)從wp_careers檢索到15條記錄,那麼我只想要檢索與wp_careers相關的wp_educations記錄。 –