2014-05-20 21 views
0

我在現有的一個目錄類型網站的mysql數據庫中有4個表。 表mt_links包含每個上市 表mt_cl包含上述上市是在哪個類別(我只想CAT_ID = 1) 表mt_cfvalues包含更多的信息對每個上市它可以有重複的值 表mt_images基本信息中包含的圖片名稱爲每個列表。從多個表中檢索記錄有些不同,有些沒有

我想從mt_links的所有記錄mt_cl cat_id = 1,並且對於每個記錄,我需要mt_cfvalues和cf_images中與link_id匹配的所有記錄。

我設置了一個帶有Group_Concat的選擇並留下了連接,但最終在結果中重複了值。我添加了Distinct,它可以治癒重複值,但mt_cfvalues可以具有相同值的記錄,所以現在我缺少了我應該擁有的值。

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      GROUP_CONCAT(DISTINCT b.value ORDER BY b.cf_ID) AS details, 
      GROUP_CONCAT(DISTINCT c.filename ORDER BY c.ordering) AS images 
FROM  mt_links a 
LEFT JOIN mt_cfvalues b ON a.link_id = b.link_ID 
LEFT JOIN mt_images c ON b.link_id = c.link_ID 
LEFT JOIN mt_cl d ON a.link_id = d.link_ID WHERE d.cat_ID = '1' 
GROUP BY a.link_id 

我放在一起這裏SQLFiddle:http://www.sqlfiddle.com/#!2/f39e9/1

是否有更簡單的方法?我如何解決重複/不重複的問題?

+0

當您遇到重複值時會發生什麼? – James

+0

我的結果中應包含來自mt_cfvalues的重複值。在我的小提琴中注意,鏈接ID 1 ...在細節列中它應該已經返回「好,沒有貓,好」 – DaveS

回答

0

這是實現你所尋求的一種方法。因爲這兩個子查詢返回獨立的結果,所以不能合併GROUP BY,這就是爲什麼你得到重複。

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      cvf.details, 
      imgs.images 
FROM  mt_links a 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(value ORDER BY cf_ID) AS details 
    FROM mt_cfvalues 
    GROUP BY link_ID 
) cvf ON cvf.link_ID = a.link_id 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(filename ORDER BY ordering) AS images 
    FROM mt_images 
    GROUP BY link_ID 
) imgs ON imgs.link_ID = a.link_id 
INNER JOIN mt_cl d ON a.link_id = d.link_ID 
WHERE d.cat_ID = '1' 
+0

謝謝詹姆斯。這正是我需要的 – DaveS

相關問題