Подсчёт количества детей в таблице

221
15 декабря 2016, 15:51

Есть следующая таблица:

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

Можно это реализовать одним запросом?

Answer 1

Вот такой запрос вернет вам всех пользователей, у которых статус равен 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
Answer 2

В качестве альтернативного решения, можно использовать самообъединение таблицы 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
READ ALSO
Формирования запроса Select DESC

Формирования запроса Select DESC

Доброго времени суток! У меня проблема с выводом топа, вот собственно запрос

205
Оператор сравнения NOT IN

Оператор сравнения NOT IN

Допутим я хочу вывести новости из БД но не учитывая определенных пользователейПример:

188
Timestamp выборка данных за определенное время

Timestamp выборка данных за определенное время

создана таблица с полем time типом timestampДаннЫе хранятся в формате 2013-06-27 14:33:43 Как выбрать данные за последний час? WHERE NOW()-time<60*60 не той выдает...

229