我正在制作照片库项目。我想列出最近创建的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在一个有效的查询中执行此操作?
答案 0 :(得分:2)
我认为您正在寻找以下查询,该查询使用子查询返回最近的20张相册,然后在照片表格中JOINs
返回与这些相册相关的照片(替换为{{1如果需要):
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
声明,因为我怀疑这些是从您的相册表中返回的20个ID。
编辑:如果我理解你的评论,你只需要将A.Created添加到主查询的ORDER BY子句中:
WHERE
根据需要在每个字段后使用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
。