如何在MySQL中为每个用户最多选择3个项目?
我运行一个网站,用户可以在其中发布项目(例如图片)。这些项目存储在MySQL数据库中 我想查询最近十个已发布的项目,但限制为最多3个项目可以来自任何单个用户 最好的方法是什么?我的首选解决方案是对请求最后十项的SQL查询施加约束。但是关于如何建立数据库设计的想法是非常受欢迎的 提前谢谢如何在MySQL中为每个用户最多选择3个项目?,mysql,sql,database,Mysql,Sql,Database,我运行一个网站,用户可以在其中发布项目(例如图片)。这些项目存储在MySQL数据库中 我想查询最近十个已发布的项目,但限制为最多3个项目可以来自任何单个用户 最好的方法是什么?我的首选解决方案是对请求最后十项的SQL查询施加约束。但是关于如何建立数据库设计的想法是非常受欢迎的 提前谢谢 BR这很困难,因为MySQL不支持子查询上的LIMIT子句。如果有,这将是相当琐碎的。。。但遗憾的是,这是我天真的做法: SELECT i.UserId, i.ImageId FROM UserSup
BR这很困难,因为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;
我会首先选择10个不同的用户,然后从每个用户中选择限制为3的图像,可能是所有用户的联合,并限制为10
这至少可以将需要处理的数据缩小到一个合理的范围。使用相关子查询非常简单:
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个吗?
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