为每组随机分配行,并使用2个不同的条件选择N行

时间:2018-10-10 15:23:58

标签: mysql

(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; 

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

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

请帮助我。您的帮助将帮助我为博士学位设计我的第二个实验。

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

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

所需的输出:

Desired output

1 个答案:

答案 0 :(得分:0)

在MySQL 8.0及更高版本中,我们可以使用Window Functions。我们在Partitionschemename的{​​{3}}字符串表达式上使用type

尝试( concatenated ):

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