2013-03-29 3 views
0

Я работаю над проектом фотогалереи. Я хочу перечислить 20 недавно созданных альбомов, а также показать каждую недавно загруженную фотографию этих альбомов (если она есть). То, как я делаю это сейчас, - это запрос альбомов ($this->Album->find('all', ...)), а затем передача идентификаторов из этих результатов в мой второй запрос, который является запросом, который находит самую последнюю загруженную фотографию для 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 идентификаторов, возвращаемых из таблицы ваших альбомов.

EDIT: Если я правильно понял ваши комментарии, вам просто нужно добавить A.Created, чтобы заказать основной запрос в 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 

Использование ASC и DESC после каждого поля по мере необходимости.

+0

Этот запрос вытаскивает правильные альбомы, но они отображаются в случайном порядке, а не в «Созданный DESC», как есть в подзапросе. Кроме того, вытаскиваемая фотография кажется самой старой, а не самой новой. Хотя я, безусловно, ценю ваши усилия! – Nick

+0

@Nick - я обновил ответ, добавленный a.created в пункт запроса запроса по запросу. Удачи! – sgeddes

+0

Спасибо, что фиксированная часть проблемы! Тем не менее, проблема заключается в том, что фотография не является правильной. – Nick

Смежные вопросы