在專案開發中,我遇到一個經典的 MySQL GROUP_CONCAT 問題:當主表某筆資料在關聯表中沒有對應記錄時,該筆資料竟然直接從結果集中消失了。花了大量時間搜尋才發現,問題出在連接方式上——預設的隱式內連接只會返回兩張表都匹配的行,導致沒有下層資料的主記錄被過濾掉。
假設有兩張表:
pid、pnamepid、pname原始 SQL 使用隱式內連接:
SELECT point.pid, point.pname, GROUP_CONCAT(downsite.pname) AS dname
FROM point, downsite
WHERE point.pid = downsite.pid
GROUP BY point.pid;
執行結果中,「北京」這個地點明明存在於 point 表,卻完全不見蹤影。原因在於 downsite 表裡沒有 pid 為北京的記錄,內連接直接將其排除。
將連接方式改為左外連接,即可保留主表所有記錄,即使從表無匹配也會顯示(對應欄位為 NULL):
SELECT point.pid, point.pname, GROUP_CONCAT(downsite.pname) AS dname
FROM point
LEFT JOIN downsite ON point.pid = downsite.pid
GROUP BY point.pid;
執行後,「北京」重新出現在結果集中,dname 欄位顯示為 NULL(或視客戶端設定顯示為空),問題完美解決。
GROUP_CONCAT 遇到 NULL 值會自動忽略,若需顯示空字串可搭配 IFNULL(GROUP_CONCAT(...), '') 處理。LEFT JOIN ... ON ... 語法,避免隱式連接造成邏輯錯誤。這個案例再次提醒我們:SQL 連接類型的選擇直接決定資料完整性,開發時務必根據業務語義精確選擇 JOIN 方式。