使用CakePHP将两个查询合并为一个

时间:2013-03-29 04:10:27

标签: sql cakephp

我正在制作照片库项目。我想列出最近创建的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在一个有效的查询中执行此操作?

1 个答案:

答案 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