0

私はフォトギャラリープロジェクトに取り組んでいます。最近作成された 20 個のアルバムを一覧表示し、それらのアルバムの最近アップロードされた写真 (ある場合) も表示したいと考えています。私が現在行っている方法は、アルバム ( $this->Album->find('all', ...)) をクエリし、それらの結果の ID を 2 番目のクエリに渡すことです。これは、最初のクエリで見つかった 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

2 つのクエリを実行するのは好きではなく、その 2 番目のクエリはかなり非効率に見えます。CakePHP にこれを 1 つの効率的なクエリで実行させる方法はありますか?

4

1 に答える 1

2

JOINsサブクエリを使用して最新の 20 枚のアルバムを返し、次にphotos テーブルでそれらのアルバムに関連付けられた写真を返す次のクエリを探していると思います(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

WHEREAlbums テーブルから返された 20 個の ID であると思われるため、ステートメントを削除しました。

編集:あなたのコメントを正しく理解していれば、メインクエリの ORDER BY 句に A.Created を追加するだけです:

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

于 2013-03-29T04:20:52.093 に答える