【问题标题】:Querying for N records associated with each record referenced by set of record keys查询与记录键集引用的每条记录关联的 N 条记录
【发布时间】:2010-09-23 18:32:42
【问题描述】:

这是我的场景的简化版本:

  • 我有一个名为 Project 的表,我通过“id”字段引用它。
  • 我有一个名为 Photo 的表,其中有一个名为“project_id”的字段,我用它来将多张照片与一个项目相关联。 Photo 表还有一个自动递增的“id”字段,我用它来进行排序等。

这是我想要完成的任务:对于项目 id 值的集合,我希望检索添加到每个项目的最后 5 张照片——当然,理想情况下是在单个查询中。 :-)

换一种说法,我希望为每个项目指定一个返回照片数量的限制,而不是施加单个查询限制。

我目前正在将其实现为每个项目一个查询,因此 N 个项目 = N 个查询(一个好的缓存策略肯定会减少伤害,但稍后会出现)。

谁有解决办法?

谢谢。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    市侩解决方案的轻微改动:

    SELECT project.*, photo.* 
      FROM photo 
      LEFT JOIN project USING(project_id)
    WHERE photo.project_id IN (comma separated list of project ids)
    ORDER BY photo_id DESC 
    LIMIT project.project_photos_limit
    

    虽然我不确定 LIMIT 是否会让你使用字段来做到这一点。

    【讨论】:

      【解决方案2】:
      SELECT project.*, photo.* 
        FROM photo 
        LEFT JOIN project USING project_id 
      WHERE photo.project_id = '{$id}' 
      ORDER BY photo_id DESC 
      LIMIT project.project_photos_limit
      

      试试看? (显然是你的字段名)

      【讨论】:

        【解决方案3】:

        对于 MySQL 中的“最后 n 项”问题,请看这里:How to select maximum 3 items per users in MySQL?(就在最上面的答案中)。

        当您从那里获取它时,您所缺少的只是与您的 Projects 表的 JOIN,这应该很容易做到。

        【讨论】:

          猜你喜欢
          • 2016-02-23
          • 2020-03-14
          • 2015-08-13
          • 2017-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多