【问题标题】:Mysql/php - Query QuestionMysql/php - 查询问题
【发布时间】:2011-04-22 13:45:58
【问题描述】:

我一直试图找出一种不同的方式来完成这个网站上另一个问题的任务,但我想也许我把它弄得太难了。

这是我所拥有的: 具有 ImageID、ImageName、GalleryID 的表 另一个包含评论、作者、日期、ImageID 的表

我要做的是进行查询,在其中找到所有具有 galleryID=42 的图像。此外,我想获取与每张图片关联的所有 cmets(通过 ImageID)并将它们连接成一个值。例如:

ImageID: 1234, ImageName: IMG425, GalleryID: 42, Comments: Cool!|||John Smith|||2010-09-06~~拍得好!|||Richard Clark|||2010-10-01 ~~我记得这次跑步。|||Susan Edwards|||2010-10-04

我需要连接 Comments 表中针对每个图像的所有结果并将它们作为单个值放入,然后我可以通过 PHP 在我的页面正文中解析它们。

【问题讨论】:

  • 你能和我们分享一些代码和SQL吗?
  • 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 Galleries ON GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN Comments ON GalleryData.ID = Comments.ID 当有超过 1 条与图像相关联的评论时,这会产生重复的图像记录。

标签: php mysql subquery concatenation


【解决方案1】:

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 是否适用于连接

【讨论】:

  • 我试过这个,但它只给了我一个结果。SELECT GalleryData.ID, GalleryData.FileName, GalleryData.GalleryID, GalleryData.Description, Galleries.GalleryName, Galleries.GalleryFolder, GROUP_CONCAT(Comments.CommentAuthor ,Comments.CommentDate, Comments.Comment ORDER BY Comments.CommentDate SEPARATOR '|||') FROM GalleryData INNER JOIN Gallery ON GalleryData.GalleryID = Galleries.GalleryID LEFT JOIN Comments ON GalleryData.ID = Comments.ID WHERE GalleryData.GalleryID =42
  • 您忘记了最后一个 GROUP BY 吗?或者你用完了字符 =P .. 尝试一个简单的查询来检查 group_concat() 是否是你的答案,也许只是显示 imageID 和 cmets 的作者..
【解决方案2】:

为什么不在单独的查询中提取 cmets 数据?

虽然对数据库的额外访问并不理想,但它的开销可能与连接和提取数据一样多,并且分离查询将使您的代码不那么混乱。

【讨论】:

  • 在我看来这似乎是不合理的。仅仅因为您的原始代码包含一个缺陷(并且鉴于该问题的 cmets,您似乎有可行的选择来解决原始问题)。您甚至在问题中说您可能使问题过于复杂。根据我的经验,重写简单的代码以暴力破解解决方案只会在以后导致各种焦虑。
【解决方案3】:

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;

【讨论】:

  • 连接部分有效,但它只产生具有 cmets 的图像。我希望它显示所有图像,但包括 cmets 和实际具有 cmets 的图像。具有该 GalleryID 的图像大约有 400 张,当我运行查询时,只有 3 张显示,因为那些是带有 cmets 的。
  • 抱歉。左加入评论然后:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2012-03-01
  • 2015-09-15
  • 2012-04-15
相关资源
最近更新 更多