如何在MySQL中为每个用户选择最多3个项目?

时间:2008-11-07 10:43:07

标签: mysql sql database

我运营一个用户可以发布项目(例如图片)的网站。这些项目存储在MySQL数据库中。

我想查询最后十个发布的项目,但最多3个项目的约束可以来自任何单个用户。

最好的方法是什么?我首选的解决方案是一个约束,它放在请求最后十个项目的SQL查询上。但是关于如何设置数据库设计的想法非常受欢迎。

提前致谢!

BR

3 个答案:

答案 0 :(得分:5)

使用相关的子查询非常简单:

SELECT `img`.`id` , `img`.`userid`
FROM `img`
WHERE 3 > (
SELECT count( * )
FROM `img` AS `img1`
WHERE `img`.`userid` = `img1`.`userid`
AND `img`.`id` > `img1`.`id` )
ORDER BY `img`.`id` DESC
LIMIT 10 

该查询假定较大的id表示稍后添加

相关的子查询是一个强大的工具! : - )

答案 1 :(得分:2)

这很难,因为MySQL不支持子查询的LIMIT子句。如果确实如此,这将是相当微不足道的......但是,唉,这是我的天真方法:

SELECT
  i.UserId,
  i.ImageId
FROM
  UserSuppliedImages i
WHERE
  /* second valid ImageId */
  ImageId = (
    SELECT MAX(ImageId)
    FROM UserSuppliedImages
    WHERE UserId = i.UserId
  )
  OR
  /* second valid ImageId */
  ImageId = (
    SELECT MAX(ImageId)
    FROM   UserSuppliedImages
    WHERE UserId = i.UserId
      AND ImageId < (
        SELECT MAX(ImageId)
        FROM UserSuppliedImages
        WHERE UserId = i.UserId
      )
    )
  /* you get the picture... 
     the more "per user" images you want, the more complex this will get */
LIMIT 10;

您没有评论是否有首选结果顺序,因此这会选择最新图像(假设ImageId是一个递增的自动递增值)。

为了进行比较,在SQL Server上看起来像这样:

SELECT TOP 10
  img.ImageId,
  img.ImagePath,
  img.UserId
FROM
  UserSuppliedImages img
WHERE
  ImageId IN (
    SELECT TOP 3 ImageId
    FROM UserSuppliedImages 
    WHERE UserId = img.UserId
  )

答案 2 :(得分:0)

我首先选择10个不同的用户,然后从每个用户中选择LIMIT 3的图像,可能是所有这些用户的联合,并将其限制为10。

这将至少缩小您需要处理的数据的范围。