【问题标题】:Retrieve an arbitrary number of random rows from each 'group by' category in MySQL从 MySQL 中的每个 'group by' 类别中检索任意数量的随机行
【发布时间】:2012-12-02 17:16:15
【问题描述】:

我在 MySQL 中有一个表,其中包含一个列名 category。 我正在尝试编写一个查询,它将从每个 category 返回 2 条随机记录。

这是我用来从每个 category 获取 2 条记录的代码,在我的 rating 列中具有最高值:

SELECT e1.* 
FROM   entries AS e1 
WHERE  (SELECT Count(*) 
        FROM   entries AS e2 
        WHERE  e2.category = e1.category 
               AND e1.rating <= e2.rating) <= 2 
ORDER  BY category, 
          rating DESC 

查看此链接以查看包含一些示例数据和上述查询的表格: http://sqlfiddle.com/#!9/bab8e/1

【问题讨论】:

  • 你到底需要什么......每个类别的2个随机记录对吗?或其他什么,这是否与您包含的查询有关..!?
  • 查询只是为了显示我正在使用的内容,假设我在每个类别的表 10 中有 30 个条目,我想检索每个类别的 2 个随机条目。这将返回 6 个结果。

标签: mysql select random group-by


【解决方案1】:

我通过按类别列和随机数对表格进行排序来实现您想要的结果。然后,我为每一行分配一个递增的数字,每次类别更改时从 1 开始。然后,我只返回 rowNum 小于或等于 2 的结果。如果您想返回 3 个随机行,只需将其更改为小于或等于 3,依此类推。

SELECT entry_id, 
       category, 
       rating 
FROM   (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum, 
               @category := category                                 AS categoryVar, 
               e1.* 
        FROM   (SELECT *, 
                       (SELECT @currank := 0) r 
                FROM   entries 
                ORDER  BY category, 
                          Rand()) AS e1)AS e2 
WHERE  rownum <= 2 
ORDER  BY category, 
          rating; 

这是一个 sqlfiddle 链接,类似于您在问题中发布的链接: http://sqlfiddle.com/#!9/bab8e/37/0


请注意,同样的查询可以很容易地调整为返回一组非随机的记录。例如,如果您想从每个 category 返回前 5 个 ratings,您可以更改

ORDER BY category,rand()

ORDER BY category, rating DESC

变化

WHERE rownum &lt;= 2

WHERE rownum &lt;= 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多