SQL-запрос для поиска внуков объекта - PullRequest
0 голосов
/ 06 июля 2018

Предположим, у меня есть такая таблица:

+----+-----------+---------+--------+---------+
| id |   name    | surname | dad_id | mom_id  |
+----+-----------+---------+--------+---------+
|  1 | John      | Smith   |      2 |       3 |
|  2 | Arnold    | Smith   |      7 |       8 |
|  3 | Margaret  | Smith   |      5 |       6 |
|  4 | Junior    | Smith   |      1 |       9 |
+----+-----------+---------+--------+---------+

Он хранит людей и их отношения как родителей-детей. Мне интересно, как будет выглядеть запрос, который вернет имя и фамилию человека с наибольшим количеством внуков. Я понятия не имею, с чего начать.

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Чтобы получить родителей с наибольшим количеством детей, все люди в одной таблице данных

Примерно так, плюс работающая SQL-скрипка. Надеюсь, это поможет!


SQL__Список родителей, упорядоченный по количеству / счету детей

SELECT
  parents.parent as 'parent',
  MAX(parents.count) as 'score'
FROM (
  SELECT
    CONCAT(t2.name, " ", t2.surname) as 'parent',
    count(t1.parent_id) as 'count'
  FROM (
    -- LIST parent id, kid id
      -- * list of unique pairs: dad_id and id, 
      -- * also mom_id and id
    SELECT DISTINCT 
       dad_id as 'parent_id', id,
       name, surname
    FROM family
    UNION
    SELECT DISTINCT 
       mom_id as 'parent_id', id,
       name, surname
    FROM family
  ) as t1
  INNER JOIN family AS t2 ON t1.parent_id = t2.id
  GROUP BY parent_id
  ORDER BY parent_id
) as parents
GROUP BY parents.parent
ORDER BY 'score';

Также, если вы хотите вернуть ТОЛЬКО первый результат (т. Е. Самый родственный), вы можете добавить «LIMIT 1» в конце или что-то в этом роде.

SQL Fiddle

0 голосов
/ 06 июля 2018

Сначала нашли людей, у которых есть ребенок, и сохраните их во временном столе вместе со своим ребенком. Потом нашли людей, у которых тоже есть ребенок.

SQL-скрипт:

-- Create table
CREATE TABLE #Family
(
    id INT,
    name VARCHAR(30),
    surname VARCHAR(30),
    dad_id INT,
    mom_id INT
)

--insert data
INSERT INTO #Family (id, name, surname, dad_id, mom_id) VALUES (1, 'John', 'Smith', 2, 3)
INSERT INTO #Family (id, name, surname, dad_id, mom_id) VALUES (2, 'Arnold', 'Smith', 7, 8)
INSERT INTO #Family (id, name, surname, dad_id, mom_id) VALUES (3, 'Margaret', 'Smith', 5, 6)
INSERT INTO #Family (id, name, surname, dad_id, mom_id) VALUES (4, 'Junior', 'Smith', 1, 9)


-- Find people With child and save it into temporary table #FGTwo (family generation two)
SELECT * INTO #FGTwo FROM
(SELECT f.id, f.name, f.surname, f.dad_id, f.mom_id, 
fd.id cid, fd.name cname, fd.surname csurname, fd.dad_id cdad_id, fd.mom_id cmom_id
FROM #Family f
INNER JOIN #Family fd ON fd.dad_id = f.id
UNION ALL
SELECT f.id, f.name, f.surname, f.dad_id, f.mom_id, 
fm.id cid, fm.name cname, fm.surname csurname, fm.dad_id cdad_id, fm.mom_id cmom_id
FROM #Family f
INNER JOIN #Family fm ON fm.mom_id = f.id) AS FG2

--Uncomment next line to see people With their child
-- select * from #FGTwo

-- Find people With Grandchild and save it into temporary table #PeopleWithGrandchildren
SELECT * INTO #PeopleWithGrandchildren FROM
(SELECT f2.id, f2.name, f2.surname
from #FGTwo f2
INNER JOIN #Family fd ON fd.dad_id = f2.cid
UNION ALL
SELECT f2.id, f2.name, f2.surname
FROM #FGTwo f2
INNER JOIN #Family fm ON fm.mom_id = f2.cid) pwg

--Uncomment next line to see people With their child
-- select * from #PeopleWithGrandchildren

-- Finds all people having the same maximal number of grandchildren
DECLARE @MaxCount INT
SET @MaxCount = (SELECT TOP 1 COUNT(id) AS MaxCount FROM #PeopleWithGrandchildren GROUP BY id ORDER BY MaxCount DESC)

SELECT name, surname FROM #PeopleWithGrandchildren 
WHERE id IN 
(SELECT GC.id FROM 
(SELECT id, COUNT(id) AS GCount FROM #PeopleWithGrandchildren GROUP BY id) GC
WHERE GCount = @MaxCount)
--If you want to select only one use the "SELECT TOP 1 " instead of "SELECT *"

-- drop all temporary tables
drop table #Family
drop table #FGTwo
drop table #PeopleWithGrandchildren

Выход:

name        surname
Arnold      Smith
Margaret    Smith
0 голосов
/ 06 июля 2018
#table list of fathers and their kid names

CREATE VIEW father AS SELECT  A.mom_id, B.name, B.surname FROM tablename A JOIN tablename B ON A.id = B.dad_id FROM tablename A JOIN tablename B ON A.id = B.dad_id

#table list of mothers and their kid names

CREATE VIEW mother AS SELECT A.mom_id, B.name, B.surname FROM tablename A JOIN tablename B ON A.id = B.dad_id FROM FROM tablename A JOIN tablename B ON A.id = B.mom_id

#table of grandpas link with their sons who have kids and count how many there are, 
#each father name will be repeated if they have more than one kids, so if we count the number father 
#names attach to grandpa names, we essentially find the number of grandkids. I got a little 
#lazy here and use order by greatest count instead of returning the max count to find the grandpa with the highest grand kids.
**#This will only give you # of kids produce by your sons. You also need to add the kids produce by your daughters.**

SELECT  T.id, T.name, T.surname, father.name, COUNT(father.name) FROM father JOIN tablename T ON tablename.id = father.dad_id GROUP BY T.id ORDER BY DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...