2013-03-29 37 views
0

我正在開發一個照片庫項目。我想列出最近創建的20張專輯,並顯示這些專輯最近上傳的照片(如果有)。我現在的做法是查詢相冊($this->Album->find('all', ...)),然後將這些結果中的ID傳遞到我的第二個查詢中,該查詢是查找第一個查詢找到的20個相冊中最近上傳的照片的查詢。將兩個查詢合併爲一個CakePHP

這是實際的查詢是什麼樣子:

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在一個高效的查詢中執行此操作?

回答

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個Ids。

編輯:如果我理解正確的你的意見,你只需要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每個字段後,根據需要。

+0

該查詢正在提取正確的相冊,但它們似乎以隨機順序列出,而不像您在子查詢中那樣使用「Created DESC」。此外,被拉的照片似乎是最古老的,而不是最新的。不過,我絕對感謝你的努力! – Nick

+0

@Nick - 我更新了答案將a.created添加到主查詢的order by子句中。祝你好運! – sgeddes

+0

謝謝,這是固定部分的問題!不過,這張照片仍然存在問題。 – Nick