SQL Сервер - подсчитайте количество живых бабушек и дедушек - PullRequest
1 голос
/ 21 марта 2020

Я занимаюсь домашним обучением баз данных и в настоящее время пытаюсь решить следующую проблему:

Выберите идентификатор и имя людей, которые являются внуками. Также выберите для каждого человека число его все еще живущих бабушек и дедушек.

Моя таблица выглядит следующим образом:

id, name, date_of_birth, date_of_death (NULL, когда человек жив), пол, Father_id, mother_id

Мне удалось решить эту часть с помощью выбора идентификатора и имени людей, которые являются внуками, следующим образом:

SELECT b.name, b.id
FROM persons a
JOIN persons b ON c.father_id = a.id or a.mother_id = a.id
JOIN persons c on p.father_id = c.id 
WHERE b.father_id = a.id or b.mother_id = a.id;

Однако я не могу решить эту часть с количеством все еще живущих бабушек и дедушек для каждого человека.

Не могли бы вы мне помочь?

Спасибо

Ответы [ 3 ]

1 голос
/ 21 марта 2020

Это вопрос объединения таблиц. Я думаю, что вы все смущены псевдонимами таблиц при самообъединении. Так что дайте им значимые псевдонимы:

  • p для человека
  • pp для родителей человека
  • gp для бабушка и дедушка этого человека

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

SELECT p.name, p.id,
       SUM(CASE WHEN gp.date_of_death IS NULL THEN 1 ELSE 0 END)
FROM persons p JOIN    -- persons
     persons pp        -- parents
     ON pp.id IN (p.father_id, p.mother_id) JOIN
     persons gp
     ON gp.id IN (pp.father_id, pp.mother_id)
GROUP BY p.name, p.id;

Обратите внимание на условную сумму, которая включает дату смерти .

0 голосов
/ 21 марта 2020

Проверьте SQL Fiddle для решения:)

http://sqlfiddle.com/#! 9 / 441ad0 / 16

    select 
  (
    select 
      count(*) 
    from 
      people 
    where 
      (
        id = p.fatherId 
        or id = p.motherId
      ) 
      and (
        fatherId in (
          select 
            id 
          from 
            people 
          where 
            dod is null
        ) 
        or motherId in (
          select 
            id 
          from 
            people 
          where 
            dod is null
        )
      )
  ) as mycount, 
  p.name, 
  p.id, 
  p.fatherId, 
  p.motherId 
FROM 
  people p 
WHERE 
  p.fatherId in (
    SELECT 
      id 
    from 
      people 
    where 
      id = p.fatherId 
      and fatherId in (
        SELECT 
          id 
        from 
          people 
        where 
          1 = 1
      )
  ) 
  OR p.motherId in (
    SELECT 
      id 
    from 
      people 
    where 
      id = p.motherId 
      and motherId in (
        SELECT 
          id 
        from 
          people 
        where 
          1 = 1
      )
  )
0 голосов
/ 21 марта 2020

Вам необходимо присоединиться к 3 копиям таблицы, группировать по человеку и условно подсчитать количество живущих бабушек и дедушек:

SELECT p.id, p.name, 
  count(case when p2.date_of_death is null then 1 end) living_grandparents 
FROM persons p
JOIN persons p1 ON p1.id IN (p.father_id, p.mother_id) 
JOIN persons p2 on p2.id IN (p1.father_id, p1.mother_id) 
GROUP BY p.id, p.name

Для MySql условие может быть упрощено до:

sum(p2.date_of_death is null) living_grandparents 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...