2011-09-21 14 views
16

不同領域的多個GROUP_CONCAT我有這樣的查詢:上使用MySQL

SELECT product.id, 
     GROUP_CONCAT(image.id) AS images_id, 
     GROUP_CONCAT(image.title) AS images_title, 
     GROUP_CONCAT(facet.id) AS facets_id 
... 
GROUP BY product.id 

和查詢工作,但並不如預期,因爲如果我有5面和1個圖像的產品(假設圖像使用id = 7),然後我得到這樣的事情在 「images_id」:
「7,7,7,7,7」
如果我有2幅圖像(7和3)然後我得到的是這樣的:
「7,7,7,7,7,3,3,3,3,3」
和我刻面得到的東西,如:
「8,7,6,5,4,8,7,6,5,4」

我認爲MySQL正在做一些類型的型動物工會查詢返回的行,然後連接所有內容。

我的預期結果是(對於最後一個例子):

images_id = 「7,3」
facets_id = 「8,7,6,5,4」

我可以獲取在GROUP_CONCAT中使用DISTINCT,但我有另一個問題: 如果我有兩個圖像具有相同的標題,其中一個是ommited,然後我得到類似的東西:
images_id =「7,3,5」
images_title =「Title7and3,Title5」

所以我想念images_id和images_title之間的關係。

有人知道是否有可能在MySQL中進行此查詢嗎?

也許我正在複雜化一切,沒有任何真正的好處。 我試圖只執行一個查詢,因爲性能,但現在我不太確定它是否更快執行兩個查詢(一個用於選擇facets和另一個用於圖像)。

請解釋一下你認爲最好的解決方案和原因。

謝謝!

回答

8

你需要分別獲得各組:

SELECT 
    p.id, 
    images_id, 
    images_title, 
    facets_id, 
    ... 
FROM PRODUCT p 
JOIN (SELECT product.id, GROUP_CONCAT(image.id) AS images_id 
     FROM PRODUCT GROUP BY product.id) a on a.id = p.id 
JOIN (SELECT product.id, GROUP_CONCAT(image.title) AS images_title 
     FROM PRODUCT GROUP BY product.id) b on b.id = p.id 
JOIN (SELECT product.id, GROUP_CONCAT(facet.id) AS facets_id 
     FROM PRODUCT GROUP BY product.id) b on c.id = p.id 
... 
+0

我不太瞭解你的查詢,但它看起來非常複雜,我的意思是,我們需要一個子集,每個concat都有一組?它看起來很慢,不是更快2查詢? – Enrique

+2

@恩裏克,這不是速度,而是關於正確性。如果我的代碼不需要實際工作,我可以立即做所有事情。 – Johan

+0

@Enrique,對於每個組concat,不需要子選擇,只適用於與p.id匹配的表每個p.id返回多於1行的表。 – Johan

1

如果問題是速度,那麼它可能是快了很多簡單地選擇你需要作爲單獨的行中的數據,並執行分組在應用中,即:

SELECT product.id, image.id, image.title, facet.id 

然後在應用程序:

foreach row: 
    push product_id onto list_of_product_ids 
    push image_id onto list_of_image_ids 
etc. 
30

只需添加DISTINCT

例子:
GROUP_CONCAT(DISTINCT image.id) AS images_id

+0

+1,它也適用於SQLite3 – user457015

+0

我認爲這需要擴展。 DISTINCT => GROUP_CONCAT(DISTINCT image.id)AS images_id'似乎不是SQL語法,MySQL 5.1會引發語法錯誤。提問者沒有提及任何編程語言,所以如果這個答案不是SQL,它需要被轉換或解釋。 – Animism

+0

多個「GROUP_CONCAT」沒有額外的行。 +1 –

4

您可以添加只是DISTINCT關鍵字,你會得到你的願望的結果。

SELECT tb_mod.*, tb_van.*, 
GROUP_CONCAT(DISTINCT tb_voil.vt_id) AS voil, 
GROUP_CONCAT(DISTINCT tb_other.oa_id) AS other, 
GROUP_CONCAT(DISTINCT tb_ref.rp_id) AS referral 
FROM cp_modules_record_tbl tb_mod 
LEFT JOIN cp_vane_police_tbl tb_van ON tb_van.mr_id= tb_mod.id 
LEFT JOIN cp_mod_voilt_tbl tb_voil ON tb_voil.mr_id= tb_mod.id 
LEFT JOIN cp_mod_otheraction_tbl tb_other ON tb_other.mr_id= tb_mod.id 
LEFT JOIN cp_mod_referral_tbl tb_ref ON tb_ref.mr_id= tb_mod.id 
WHERE tb_mod.mod_type = 2 GROUP BY tb_mod.id