首页 > 解决方案 > 为每个组随机化行并选择具有 2 个不同标准的 N 行

问题描述

(SELECT schemename, message FROM RandomMessagesSet where type = 'ES' ORDER BY RAND()) 
 UNION ALL (SELECT schemename, message FROM RandomMessagesSet where type = 'HE' ORDER BY RAND()) ORDER BY schemename; 

这给出了所有消息及其方案名称的列表。有没有办法为每个方案名获得 3 个“ES”类型和 2 个“HE”类型?

这不是家庭作业,而是研究问题的一部分,将用于设计用户研究。我通过查看这里的大多数帖子尝试使用 LIMIT 和 JOIN ,但仍然卡住了。

请帮我。你的帮助将帮助我为我的博士设计我的倒数第二个实验。

编辑:感谢最有同情心的人对此表示反对。您应该尝试自己攻读博士学位以感受一下。

由于研究工作的性质,恐怕我无法提供样本数据。

期望的输出:

期望的输出

标签: mysql

解决方案


在 MySQL 8.0 及以上版本中,我们可以使用Window Functions。我们使用和的连接字符串Partition的表达式。schemenametype

试试(DB Fiddle):

SELECT dt.schemename, 
       dt.type, 
       dt.message
FROM 
(
 SELECT 
   schemename, 
   type, 
   message, 
   ROW_NUMBER() OVER (PARTITION BY CONCAT(schemename, '-', type) 
                      ORDER BY RAND()) AS row_num 
 FROM RandomMessagesSet
) AS dt 
WHERE (dt.type = 'ES' AND dt.row_num <= 3) OR 
      (dt.type = 'HE' AND dt.row_num <= 2) 
ORDER BY dt.schemename 

推荐阅读