1

我已经看到了类似问题的答案,但找不到解决此问题的方法。

我需要从三个表中选择相册、单张照片和用户详细信息。我只想为每个用户返回最近的专辑。尝试分组和 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

很难想象您的表的架构,但我猜每个表中都有auto_increment 列。一个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在两个子查询中使用了名为 used 的列:de. 这些列是每个表上的auto_incremented 列。如果您有定义其状态的日期列,无论它们是否是最近的,您也可以使用它。

于 2013-03-29T11:37:04.980 回答
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 文档中找到另外两个解决方案。

于 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 回答