簡體   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