2012-06-30 75 views
1

我有兩個表images2IMAGE_DATAMySQL的合併查詢,而忽略重複

enter image description here enter image description here

所以我們的目標是擁有1臺的所有圖片上傳(images2),然後image_data是用不同的選項分配該圖像。

因此,例如,這裏是一些示例數據:

enter image description here

所以image_id 10具有多個行,因爲該圖像與兩個TN和CQ相關聯。而且他們也可以與多個語言和幻燈片相關聯,所以我將添加到第二行並更改slide_id或language_id ..如果想添加更多內容,則比爲它添加新行。

目標是讓所有圖像都有一個列表,然後當你點擊它時,它會彈出,你可以編輯選項並直接從那裏改變它。

enter image description here

我需要幫助編寫查詢。一個我現在所擁有的:

SELECT images2.id, images2.filename, image_data.slide_id, image_data.language_id, 
image_data.type FROM images2 
LEFT JOIN image_data ON images2.id = image_data.image_id 

有兩件事情不妥查詢..這正顯示出重複的,因爲image_id 10有兩行。

enter image description here

但我需要的是圖像#10的第二排,因爲我需要看到的是它也與CQ相關的,所以我可以選中該複選框,當它彈出。

所以我需要創建一個查詢來顯示所有獨特的圖像沒有重複,所有的選項。

我不知道最好的辦法做到這一點..我需要重新做我的數據庫表的方式嗎?任何幫助表示讚賞。

謝謝。

+0

你是什麼意思「顯示所有獨特的圖像沒有重複,所有它的選項」最好顯示預期的輸出 – Mark

+0

我正在使用一個查詢來顯示所有的圖像,並抓住所有的選項。所以如果我的查詢返回同一個photo_id的多行,我的照片庫就會多次顯示該圖像。 – Drew

+0

,但你說我需要看到它也與CQ相關聯 - 所以你想要什麼? – Mark

回答

2

你可以做的是使用GROUP_CONCAT()把多行值到一個單一的連接字符串。以下檢索slideslanguages的ID以及它們的名稱,以更好地幫助您的表單。

SELECT 
    a.id, 
    a.filename, 
    GROUP_CONCAT(CONCAT(b.slide_id, '::', c.slide_name)) AS slides, 
    GROUP_CONCAT(CONCAT(b.language_id, '::', d.language_name)) AS languages, 
    GROUP_CONCAT(b.type) AS types, 
FROM 
    images a 
LEFT JOIN 
    image_data b ON a.id = b.image_id 
LEFT JOIN 
    slides c ON b.slide_id = c.id 
LEFT JOIN 
    languages d ON c.language_id = d.id 
GROUP BY 
    a.id 

您的圖像10結果集看起來像:

id | image_filename | slides | languages | types 
------------------------------------------------------------------------- 
10 | p170sfhe...  | 5::slide5 | 1::language1 | TN,CQ 

在PHP中,只是explode()基於分隔符的字符串。

+0

除了在「TN,CQ」中的空格作爲默認分隔符是','沒有空格,所以它的唯一「TN,CQ」 –

+0

這個工作完美,非常感謝你 – Drew

1

你可以使用GROUP_CONCAT獲取字段的CSV:

SELECT 
    images2.id, 
    images2.filename, 
    GROUP_CONCAT(DISTINCT image_data.slide_id) AS slides, 
    GROUP_CONCAT(DISTINCT image_data.language_id) AS langs, 
    GROUP_CONCAT(DISTINCT image_data.type) AS types 
FROM images2 
LEFT JOIN image_data ON (images2.id = image_data.image_id) 
GROUP BY images2.id