Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中为每个用户最多选择3个项目?_Mysql_Sql_Database - Fatal编程技术网

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

如何在MySQL中为每个用户最多选择3个项目?,mysql,sql,database,Mysql,Sql,Database,我运行一个网站,用户可以在其中发布项目(例如图片)。这些项目存储在MySQL数据库中 我想查询最近十个已发布的项目,但限制为最多3个项目可以来自任何单个用户 最好的方法是什么?我的首选解决方案是对请求最后十项的SQL查询施加约束。但是关于如何建立数据库设计的想法是非常受欢迎的 提前谢谢 BR这很困难,因为MySQL不支持子查询上的LIMIT子句。如果有,这将是相当琐碎的。。。但遗憾的是,这是我天真的做法: SELECT i.UserId, i.ImageId FROM UserSup

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

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

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

提前谢谢


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