为每个指定组选择n个随机行

nbysray5  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(296)

我正在努力为下面的问题找到一个最佳的解决方案。假设我有一张这样的table:

id    name    report_id
 1    name1    1
 2    name2    3
 3    name3    5
 4    name1    7
 5    name3    8
 ....................

我想为集合中的每个值选择:('name1','name2')10个随机唯一行。当然,也可以使用union,例如:

(SELECT * FROM Table
WHERE
    name='name1'
ORDER BY RAND() LIMIT 10)
UNION
(SELECT * FROM Table
WHERE
    name='name2'
ORDER BY RAND() LIMIT 10)

但是如果我有100个唯一的名字,我必须选择10个随机记录-这个查询会有点大。
提前多谢了

5ktev3wc

5ktev3wc1#

sqlfiddle演示

select ID,NAME,REPORT_ID
from
(
select *, @row:=if(name=@name,@row,0)+1 as rn, @name:=name from 
(select *,RAND() as trand from t) t1,
(select @row:=0,@name:='') tm2 
order by name,trand
) t2
where rn<=10
vuv7lop3

vuv7lop32#

这在mysql中不起作用,但在psql中可以使用 partition by ```
select name,report_id from
(select name,report_id,row_number()
over
(partition by name order by random())
as rn from Table) a
where rn<=10

我有同样的问题,从一个同事那里找到了答案。
9cbw7uwe

9cbw7uwe3#

试试这个:

SELECT
    id, 
    name,
    report_id
  FROM
  (
    SELECT id,
        report_id,
        name,
        CASE WHEN @name != name THEN @rn := 1 ELSE @rn := @rn + 1 END rn,
        @name:=name
     FROM (SELECT * FROM tbl ORDER BY RAND()) a,
        (SELECT @rn:=0, @name := NULL) r
     ORDER BY name
  ) s
  WHERE rn <= 10;

sql fiddle演示

相关问题