2010-10-07 120 views
-2

我一直在試圖找出一種不同的方式來完成這個任務在本網站上的另一個問題,但也許我想讓它太難。Mysql/php - 查詢問題

以下是我有: 表,和圖像標識,ImageName,GalleryID 並添加註釋,作者,日期其他表,圖像標識

我想要做的就是做一個查詢,我發現所有的有一個galleryID = 42的圖像。另外,我想抓取與每幅圖片相關的所有評論(通過ImageID)並將它們連接在一個單獨的值中。例如:

ImageID:1234,ImageName:IMG425,GalleryID:42,Comments:Cool!||| John Smith |||好棒!||| Richard Clark ||| 2010 -10-01 ~~我記得這次運行||| Susan Edwards ||| 2010-10-04

我需要連接評論表中的每個圖像的所有結果,並將它們放入一個單一的值,然後我可以在我的頁面正文中通過PHP解析它們。

+0

您能與我們分享一些代碼和SQL嗎? – 2010-10-07 20:01:37

+0

SELECT GalleryData.ID, GalleryData.FileName, GalleryData.GalleryID, GalleryData.Description, Galleries.GalleryName, Galleries.GalleryFolder, Comments.ID, Comments.'Comment', Comments.CommentAuthor, Comments.CommentDate FROM GalleryData INNER JOIN畫廊ON GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN評論ON GalleryData.ID = Comments.ID 這產生重複的圖像記錄時,有與圖像相關聯的多於1個評論。 – dragboatrandy 2010-10-07 20:10:42

回答

0

有MySQL中的函數調用GROUP_CONCAT我還沒有真正嘗試過,但我認爲它可以幫助

好運

編輯:

查詢可能是這樣的

SELECT img.id,img.name,img.galleryID, 
    GROUP_CONCAT(com.author,comment.date,com.content 
       ORDER BY comm.date SEPARATOR '|||') 
FROM images img JOIN comments com ON img.imageID=com.imageID 
GROUP BY img.id,img.name,img.galleryID; 

或類似的東西,但我不知道是否group_concat與連接

+0

我試過這個,但它只給我一個結果。選擇 GalleryData.ID, GalleryData.FileName, GalleryData.GalleryID, GalleryData。的描述中, Galleries.GalleryName, Galleries.GalleryFolder, GROUP_CONCAT(Comments.CommentAuthor,Comments.CommentDate,Comments.'Comment' ORDER BY Comments.CommentDate SEPARATOR '|||') FROM GalleryData INNER JOIN畫廊ON GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN評論ON GalleryData.ID =評論ID WHERE GalleryData.GalleryID = 42 – dragboatrandy 2010-10-07 20:25:23

+0

你忘記了最後一個GROUP BY嗎?或者你用完字符= P ..嘗試一個簡單的查詢來檢查group_concat()是否是你的答案,也許只是顯示imageID和評論的作者.. – pleasedontbelong 2010-10-07 20:39:31

0

爲什麼不直接在一個單獨的查詢中提取註釋數據?

儘管對數據庫的額外訪問並不理想,但它可能會像連接和提取數據一樣耗費大量開銷,並且將查詢分開將使您的代碼不再混亂。

+0

我試過了。請參閱http://stackoverflow.com/questions/3884347/php-mysql-array-pop-missing-first-value – dragboatrandy 2010-10-07 20:26:32

+1

在我看來,這看起來像是一個無足輕重的東西。僅僅因爲你的原始代碼包含一個缺陷(並且給出了關於該問題的評論,看起來你有修復原始問題的可行選項)。你甚至可以在你的問題中說,你可能會使問題過於複雜。根據我的經驗,重寫直截了當的代碼來蠻力解決問題只會導致以後各種焦慮。 – jwiscarson 2010-10-07 20:56:43

1

GROUP_CONCAT()是要走的路,其他答案都很接近。吻。

SELECT 
    ImageID, ImageName, GalleryID 
    , GROUP_CONCAT(
     CONCAT_WS('|||', Comment.author, Comment.date, Comment.content) 
     SEPARATOR '~~' 
    ) as comments 
FROM 
    Images 
    JOIN Galleries USING (GalleryID) 
    JOIN Comments USING (ImageID) 
WHERE 
    GalleryID = 42 
GROUP BY 
    ImageID, ImageName, GalleryID 

請注意,默認情況下,GROUP_CONCAT()的最大長度非常短。您可能需要運行

SET group_concat_max_len = 65535; 
+0

連接部分工作,但它只會產生具有評論的圖像。我希望它能顯示所有的圖像,但包括那些實際上有評論的評論。這個GalleryID有400個左右的圖像,當我運行查詢時,只有3個顯示,因爲那些是帶有註釋的圖像。 – dragboatrandy 2010-10-08 16:50:51

+0

對不起。左加入評論然後:) – 2010-10-09 00:52:20