СУММА по другому столбцу - PullRequest
       38

СУММА по другому столбцу

0 голосов
/ 15 января 2012

Мне нужно знать, есть ли способ сделать это без подзапроса ..

Вот моя структура таблицы:

id-name-father_id
1  joe    0
2  mark   0
3  muller 0
4  miki   2
5  timi   2
6  moses  2
7  david  1
8  momo   0
9  daniel 0
10 ermi   3

Моя логика таблицы

  • 0 означает, что он не является ребенком какого-то одного

  • 1+ означает, что он сын человеческий в этом ряду.

Примечание: если у кого-то есть ребенок, он все еще будет иметь 0 в идентификаторе отца (это значит, что в моей таблице нет дедов)

Мой запрос:

SELECT id, name, count(id=father_id) as sons
WHERE father_id = 0

Я хочу получить список не детей (father_id=0) и sum у детей это есть. Есть ли способ получить результаты без подзапроса?

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Это должно сделать это (MySQL):

SELECT `parents`.`id`, `parents`.`name`, COUNT(`children`.*) AS sons
FROM `people` AS parents
LEFT JOIN `people` AS children ON `parents`.`id` = `children`.`father_id`
WHERE `parents`.`father_id` = 0
GROUP BY `parents`.`id`

Согласно Гари нам нужно добавить name к GROUP BY в других базах данных SQL:

SELECT `parents`.`id`, `parents`.`name`, COUNT(`children`.*) AS sons
FROM `people` AS parents
LEFT JOIN `people` AS children ON `parents`.`id` = `children`.`father_id`
WHERE `parents`.`father_id` = 0
GROUP BY `parents`.`id`, `parents`.`name`

Мы соединяем стол с самим собой здесь. Итак, мы присоединяемся ко всем родителям с их детьми.

Это приведет к такому результату:

parents.id  parents.name children.id  children.name
1           joe          7            david
2           mark         4            miki
2           mark         5            timi
2           mark         6            moses
3           muller       10           ermi
8           momo         -            - # left join allows this line
9           daniel       -            -

Но теперь у нас есть каждый родитель несколько раз. Таким образом, мы ГРУППИРУЕМ все это над идентификатором родителя, что приведет к следующему:

parents.id  parents.name COUNT(children.*)
1           joe          1
2           mark         3
3           muller       1
8           momo         0
9           daniel       0
2 голосов
/ 15 января 2012

Вы должны быть в состоянии сделать это без каких-либо соединений или подзапросов следующим образом:

select case father_id when 0 then id else father_id end id,
       max(case father_id when 0 then name end)     name,
       sum(sign(father_id))                         sons
from table
group by case father_id when 0 then id else father_id
...