2010-10-07 56 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