【问题标题】:Get single random record from given categories in MySQL从 MySQL 中的给定类别中获取单个随机记录
【发布时间】:2020-09-05 18:39:53
【问题描述】:

我的数据库中有一个名为 mcq-quiz 的表,其中包含 2000 条记录:

id  question    category
1   q1  c1
2   q2  c1
3   q3  c1
4   q4  c2
5   q5  c2
6   q6  c3
7   q7  c3
8   q8  c4
9   q9  c4
10  q10 c5

我想要来自给定类别的单个记录...但记录应该是随机的。

我尝试了以下查询:

 SELECT id, question, category  FROM `mcq_quiz` where category in(c1,c2,c3,c4,c5) group by category 

它做得很好,但每次都检索相同的记录。但我每次都想要一个新的随机记录。

我也试过rand()函数,它每次都检索相同的记录,但改变了顺序。但我每次都需要随机记录。

【问题讨论】:

  • 如果这是您的目标:“我想要给定类别中的单个记录”......然后一个简单的限制和随机顺序有效(在本例中给定类别为 c1):SELECT * FROM mcq_quiz WHERE category = 'c1' ORDER BY RAND() LIMIT 1

标签: mysql sql random greatest-n-per-group


【解决方案1】:

这是每组最大 n 问题的一种变体,您希望每组有一个随机记录。

您可以使用子查询进行过滤:

select q.*
from mcq_quiz q
where category in(c1, c2, c3, c4, c5) and q.id = (
    select q1.id
    from mcq_quiz q1
    where q1.category = q.category
    order by rand()
    limit 1
)

当然,如果你运行的是 MySQL 8.0,你可以使用窗口函数:

select *
from (
    select q.*, row_number() over(partition by category order by rand()) rn
    from mcq_quiz q
    where category in(c1, c2, c3, c4, c5)
) q
where rn = 1

【讨论】:

  • 这不会从特定类别中选择问题...我只想从特定类别中获取记录。假设我给出 10 个类别,我希望返回 10 个问题。 **在(c1,c2,c3,c4,c5)中的类别**。及以上代码从 1 个类别中返回超过 1 个问题
  • @ishitechMoga:您可以在查询中添加where 子句。请参阅我编辑的答案。
  • 它很好,但它从单个类别中选择多于 1 条记录,也没有从所有类别中选择记录...有时它返回 9 行,有时 5,有时 4...我想要修复数字要返回的行数,即如果我提到 10 个类别,那么每次 10 行......来自所有 10 个类别
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 2014-04-28
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多