Могу ли я отсортировать оператор SELECT по количеству дочерних объектов в другой таблице в MySql?

Допустим, у меня есть таблица Parent и другая таблица Child. Дочерняя таблица имеет parent_id и описание. Я хотел бы сделать запрос, в котором мы получаем родительские объекты и упорядочиваем их по описанию. ОДНАКО, если есть более двух дочерних объектов, я хочу, чтобы они шли после других объектов. Возможно ли это с оператором case?

Если это поможет, я использую mysqli с PHP.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, для этого нам не нужен оператор case.

select * 
from parent p
order by
(select count(*) 
from child c
where p.parent_id = c.parent_id)

если вы хотите отделить 2 и меньше от более чем 2, это может быть так

select * 
from parent p
where 
(select count(*) 
from child c 
where c.parent_id = p.parent_id) <= 2
order by p.description
union
select * 
from parent p
where 
(select count(*) 
from child c 
where c.parent_id = p.parent_id) > 2
order by p.description
Ответ принят как подходящий

Используйте подзапрос для сбора счетчика, затем выберите из него:

select columns
from (
    select p.columns, count(c.parent_id) as childcount
    from parent p
    join child c on c.parent_id = p.id
    group by p.columns
) subquery
order by childcount > 2, description

Хитрость здесь в том, что childcount > 2 который в MySQL равен 0, если ложь, и 1, если правда, поэтому более 2 дочерних родителей появятся после всех родителей с 2 ​​или менее, и в каждой группе результатов родители сортируются по описанию.

Обратите внимание, что columns означает список столбцов в parent, которые вы хотите вернуть из своего запроса.

Другие вопросы по теме