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

Posted

技术标签:

【中文标题】如何在 MySQL 中为每个用户选择最多 3 个项目?【英文标题】:How to select maximum 3 items per users in MySQL? 【发布时间】:2008-11-07 10:43:06 【问题描述】:

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

我想查询最近 10 个发布的项目,但限制为最多 3 个项目可以来自任何单个用户。

最好的方法是什么?我首选的解决方案是对请求最后十项的 SQL 查询施加约束。但是非常欢迎关于如何设置数据库设计的想法。

提前致谢!

BR

【问题讨论】:

【参考方案1】:

关联子查询非常简单:

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 表示稍后添加

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

【讨论】:

你能用简单的英语表达这是如何工作的吗?我不明白。 子查询将消除已经存在三行具有相同用户 ID 和较低图像 ID 的任何行。我认为子查询中的大于符号可能是向后的。 这是一个 SQL 比普通英语更具表现力的例子 :-) Tom H. 给出了很好的解释;是的,我确定大于号是正确的 啊。现在我明白了。而大于实际上是正确的。这比我的好多了。 +1 这不排除所有拥有超过 3 个项目的人,而不是简单地将从他们那里获取的数量限制为 3 个吗?【参考方案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
  )

【讨论】:

【参考方案3】:

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

这至少会将您需要处理的数据范围缩小到相当数量。

【讨论】:

以上是关于如何在 MySQL 中为每个用户选择最多 3 个项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中为每个 ID 只选择一行?

如何在 MySQL 中为每个唯一列值选择两条记录作为一行?

从 MySQL 表中为 1 个用户选择多行

MySQL:如何在 SQL 查询中为每个结果插入一条记录?

excel怎么计算一列中一共有多少个项

如何在 MySql 查询中为类似 Instagram 的帖子创建视图?