0

我正在做一个照片库项目。我想列出最近创建的 20 个相册,并显示每个相册最近上传的照片(如果有的话)。我现在这样做的方式是查询相册 ( $this->Album->find('all', ...)),然后将这些结果中的 ID 传递到我的第二个查询中,该查询为第一个查询找到的 20 个相册找到最近上传的照片。

这是实际查询的样子:

SELECT `Album`.`id`, `Album`.`name`, `Album`.`photo_count` FROM `mydb`.`albums` AS `Album` WHERE 1 = 1 ORDER BY `Album`.`created` DESC LIMIT 20

SELECT `Photo`.`album_id`, `Photo`.`name` FROM `mydb`.`photos` AS `Photo` WHERE `Photo`.`album_id` IN (21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2) GROUP BY `Photo`.`album_id` ORDER BY `Photo`.`created` DESC

我不喜欢做两个查询,第二个查询看起来效率很低。有没有办法让 CakePHP 在一个高效的查询中做到这一点?

4

1 回答 1

2

我认为您正在寻找以下查询,该查询使用子查询返回最近的 20 个相册,然后JOINs在照片表上返回与这些相册关联的照片(如果需要,替换为LEFT JOIN):

SELECT A.Id, A.Name, A.Photo_Count, P.Name
FROM (SELECT * 
      FROM mydb.albums 
      ORDER BY Created DESC 
      LIMIT 20) A 
    INNER JOIN mydb.photos P ON A.Id = P.Album_Id
GROUP BY A.Id 
ORDER BY P.Created DESC

我删除了您的WHERE声明,因为我怀疑这些是从您的相册表返回的 20 个 ID。

编辑:如果我正确理解了您的评论,您只需将 A.Created 添加到您的主查询的 ORDER BY 子句中:

SELECT A.Id, A.Name, A.Photo_Count, P.Name
FROM (SELECT * 
      FROM mydb.albums 
      ORDER BY Created DESC 
      LIMIT 20) A 
    INNER JOIN mydb.photos P ON A.Id = P.Album_Id
GROUP BY A.Id 
ORDER BY A.Created DESC, P.Created

根据需要在每个字段之后 使用ASC和。DESC

于 2013-03-29T04:20:52.093 回答