Mysql 为每个指定的组选择n个随机行
我正在努力找到以下问题的最佳解决方案。 假设我有一张这样的桌子:Mysql 为每个指定的组选择n个随机行,mysql,Mysql,我正在努力找到以下问题的最佳解决方案。 假设我有一张这样的桌子: 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
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个随机记录,这个查询会有点大
提前非常感谢试试这个:
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;
这在mysql中不起作用,但在psql中,您可以使用分区
我问了同样的问题,从一位同事那里找到了这个答案。看看这个,非常感谢,哈姆雷特。这正是我想要的。@RedBaron两个查询将生成相同的计划。
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
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