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

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

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

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

提前致谢!

BR

【问题讨论】:

    标签: mysql sql database


    【解决方案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。

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

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        相关资源
        最近更新 更多