@GilbertAmethyst

Как сформировать списки с лимитом на вложения?

Здравствуйте!
Банальная задача, но никак не выходит понять как сформировать один запрос.

Есть две таблицы:
- groups (id, title) (группы)
- clients (id, username, group_id) (клиенты)

Я хочу вывести столбцы групп, в которых будут клиенты, но чтобы в каждой группе было максимум по 15 человек.
Самое простое, что придумал, это такой ужас:
// Получаю все группы
$groups = $this->getDoctrine()->getRepository(Groups::class)->findAll();
// Создаю массив для финального результата
$clients_lists = [];
foreach ($groups as $group){
	$clients_lists[$group->getId()] = [];
	// Получаю клиентов из этой группы с лимитом 15
	$clients = $this->getDoctrine()->getRepository(Clients::class)->findBy([
		'group_id' => $group->getId()
	], [], 15);
	// И добавляю их в массив под индексом группы
	$clients_lists[$group->getId()] = $clients;
}


Как сделать это нормально, минимумом запросов к БД без запросов в цикле?
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Если Вы используете MySQL 8.0 и старше, можно написать такой запрос:
select *
from (
  select
	clients.*,
	groups.title `group`, 
	row_number() over (partition by clients.id order by clients.id) rn -- order may be different
  from clients
  join `groups` on groups.id = clients.group_id
) client_groups
where rn < 10


MySQL fiddle
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы