繁体   English   中英

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

[英]Combining two queries into one with 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在一个有效的查询中执行此操作?

我认为你正在寻找它使用子查询返回最近的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

根据需要在每个字段后使用ASCDESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM