1

同様の質問への回答を見てきましたが、この問題の解決策が見つかりません。

フォト アルバム、1 枚の写真、ユーザーの詳細を 3 つのテーブルから選択する必要があります。各ユーザーの最新のアルバムのみを返したい。グループ化と SELECT DISTINCT クエリを試しても、これを行う方法が見つかりません。これが私の現在のクエリです。これは、同じユーザーから複数のアルバムを返すことを除いて正常に機能します。

SELECT 
gallery_albums.title, gallery_albums.siteID, gallery_albums.albumID, gallery_albums.albumDate, gallery_photos.photoID, gallery_albums.userID
FROM gallery_albums, users, gallery_photos
WHERE users.userID = gallery_albums.userID 
AND gallery_photos.albumID = gallery_albums.albumID
GROUP BY gallery_albums.albumID
ORDER BY gallery_albums.albumDate DESC 
LIMIT 0 , 30

ワーキングコード

これは、aarthi_ram によって提案されたソリューションのわずかな変更です。

SELECT * 
  FROM (
       SELECT gallery_albums.title, gallery_albums.siteID, gallery_albums.albumID, gallery_albums.albumDate, gallery_photos.photoID, gallery_albums.userID, users.fName, users.lName
    FROM gallery_albums, users, gallery_photos
    WHERE users.userID = gallery_albums.userID
    AND gallery_photos.albumID = gallery_albums.albumID
    GROUP BY gallery_albums.albumID
    ORDER BY gallery_albums.albumDate DESC  
  ) AS newTable
  GROUP BY userID
  ORDER BY albumDate DESC
  LIMIT 10
4

3 に答える 3

0

したがって、グループごとの最大値を探しています。この問題を解決するにはいくつかの方法があります。この場合、次のようなものが機能するはずです。

SELECT 
gallery_albums.title, gallery_albums.siteID, gallery_albums.albumID, gallery_albums.albumDate, gallery_photos.photoID, gallery_albums.userID
FROM gallery_albums
LEFT JOIN gallery_albums ga2 ON gallery_albums.albumID = ga2.albumID AND gallery_albums.albumDate < ga2.albumDate
JOIN gallery_photos ON gallery_photos.albumID = gallery_albums.albumID
JOIN users ON users.userID = gallery_albums.userID
WHERE ga2.albumID IS NULL
ORDER BY gallery_albums.albumDate DESC 

gallery_albums ga2条件と組み合わせたLEFT JOINga2.albumID IS NULLは、最新のアルバムのみを取得することを保証するものです。

MySQL のドキュメントには、他に 2 つの解決策があります。

于 2013-03-29T11:39:02.037 に答える
0
SELECT TOP 1 * FROM (SELECT 
gallery_albums.title, gallery_albums.siteID, gallery_albums.albumID,gallery_albums.albumDate, gallery_photos.photoID, gallery_albums.userID
FROM gallery_albums, users, gallery_photos
WHERE users.userID = gallery_albums.userID 
AND gallery_photos.albumID = gallery_albums.albumID
GROUP BY gallery_albums.albumID
ORDER BY gallery_albums.albumDate DESC 
LIMIT 0 , 30);

動作する可能性があります。これは、クエリによって生成された結果セットから最初の行を取得するのに役立ちます。

于 2013-03-29T11:39:15.067 に答える
0

テーブルのスキーマを想像するのは難しいですが、各テーブルにauto_increment 列があると思います。また、 a にuserは複数の を含めることができ、複数のgallery_albumsを含めることができますgallery_photos

SELECT  a.*, b.*, c.*
FROM    users a
        INNER JOIN gallery_albums b
            ON a.userID = b.userID 
        INNER JOIN gallery_photos c
            ON b.albumID = c.albumID 
        INNER JOIN
        (
            SELECT  userID, MAX(ID) max_ID
            FROM    gallery_albums
            GROUP   BY userID
        ) d ON  b.userID = d.userID AND
                b.ID = d.max_ID
        INNER JOIN
        (
            SELECT  albumID, MAX(ID) max_ID
            FROM    gallery_photos
            GROUP   BY albumID
        ) e ON  c.albumID = e.albumID AND
                c.ID = e.max_ID
ORDER   BY b.albumDate DESC
LIMIT   0, 30

ご覧のとおり、とIDの 2 つのサブクエリで使用される列がdありますe。これらの列は、各テーブルのauto_incremented 列です。最新かどうかに関係なくステータスを定義する日付列がある場合は、それも使用できます。

于 2013-03-29T11:37:04.980 に答える