我运营一个用户可以发布项目(例如图片)的网站。这些项目存储在MySQL数据库中。
我想查询最后十个发布的项目,但最多3个项目的约束可以来自任何单个用户。
最好的方法是什么?我首选的解决方案是一个约束,它放在请求最后十个项目的SQL查询上。但是关于如何设置数据库设计的想法非常受欢迎。
提前致谢!
BR
答案 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。
这将至少缩小您需要处理的数据的范围。