Предполагая следующую схему и пример данных:
create table tbl(
id int auto_increment primary key,
grp int not null,
val int not null,
index (grp)
);
insert into tbl (grp, val) values (1, 1);
insert into tbl (grp, val) values (1, 2);
insert into tbl (grp, val) values (1, 3);
insert into tbl (grp, val) values (2, 1);
insert into tbl (grp, val) values (2, 2);
Получить отдельные группы в производной таблице (или использовать базовую таблицу для групп, если есть).Получить случайный первичный ключ в подзапросе в предложении SELECT с помощью ORDER BY rand() LIMIT 1
.Затем объедините результат как производную таблицу с базовой таблицей.
select t.*
from (
select (
select id
from tbl t
where t.grp = g.grp
order by rand()
limit 1
) as id
from (select distinct grp from tbl) g
) r
join tbl t using (id);
Результат будет выглядеть примерно так:
| id | grp | val |
| --- | --- | --- |
| 2 | 1 | 2 |
| 4 | 2 | 1 |
Просмотр в БД Fiddle