如何在 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 个项目?的主要内容,如果未能解决你的问题,请参考以下文章