Есть следующая таблица:
id | name | parent_id | status
---+-------+-----------+-------
1 | name1 | 0 | 1
2 | name2 | 1 | 1
3 | name3 | 1 | 1
4 | name4 | 2 | 1
5 | name5 | 3 | 1
6 | name5 | 0 | 0
Мне нужно получить все записи, где status = 1 и количество детей меньше двух. Иными словами, нужен примерно такой результат:
id | name | кол-во детей
---+-------+-------------
2 | name2 | кол. детей 1
3 | name3 | кол. детей 1
4 | name4 | кол. детей 0
5 | name5 | кол. детей 0
Можно это реализовать одним запросом?
Вот такой запрос вернет вам всех пользователей, у которых статус равен 1 и детей меньше 2:
SELECT *
FROM users u
WHERE status = 1
AND 2 > (SELECT COUNT(id) FROM users WHERE parent_id = u.id)
Или вам нужен результат именно в таком виде?
|id|name |кол. детей
|2 |name2|кол. детей 1
|3 |name3|кол. детей 1
|4 |name4|кол. детей 0
|5 |name5|кол. детей 0
В качестве альтернативного решения, можно использовать самообъединение таблицы users.
SELECT
u.*
FROM
users u
LEFT JOIN
users p
ON
u.id = p.parent_id
WHERE
u.status = 1
GROUP BY
u.id
HAVING
COUNT(p.id) < 2
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости