У меня есть простая родословная база данных, и я хотел бы структурировать запрос, который будет возвращать имя, а не идентификатор - PullRequest
0 голосов
/ 18 января 2019

У меня в базе данных родословной довольно простые столбцы: родословная (автоинкрементный первичный ключ), имя (имя животного), дамид, сирейд. У каждого животного есть родословная, эта же родословная используется как дамид или сирейд, когда у животного есть потомство. Я хочу вернуть самого популярного отца - отца с наибольшим количеством детей в базе данных по имени, но у меня возникают проблемы с этим.

Мой sql-запрос хромает и нуждается в работе.

Этот запрос возвращает 50 самых популярных производителей по идентификатору:

SELECT pedigreeid, name, sireid, count(sireid) AS popular
FROM pedigree
GROUP BY sireid
ORDER BY popular 
DESC LIMIT 50

, но для имени и родословной он просто возвращает первого потомка, у которого этот самый популярный производитель имеет имя sire. Он не возвращает имя производителя (я могу пойти и посмотреть его, используя umbers в столбце sireid, но хочу написать запрос, который это делает.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Чтобы вытащить имя сиреида, вы можете добавить самообъединение к вашему агрегированному запросу, например:

SELECT 
    t2.pedigreeid, 
    t2.name
    count(*) popular
FROM
     pedigree t1
    INNER JOIN pedigree t2 ON t1.sireid = t2.pedigreeid
GROUP BY
    t2.pedigreeid, 
    t2.name
ORDER BY popular DESC 
LIMIT 50
0 голосов
/ 18 января 2019

Вы можете использовать собственный подзапрос для получения такого рода информации; ваш текущий выбор родословной и имени почти бессмысленны (это родословная и имя одного из потомков сиреиды).

Этот запрос даст вам идентификатор и количество потомков самых популярных производителей:

SELECT sireid, COUNT(*) AS numOffspring 
FROM pedigree 
GROUP BY sireid 
ORDER BY numOffspring DESC
LIMIT 50

ORDER BY необходим выше, чтобы получить 50 самых популярных.

Теперь вам нужно получить данные производителей:

SELECT s.pedigreeid, s.name, popular.numOffSpring
FROM (
   -- The above query goes here
) AS popular 
INNER JOIN pedigree AS s ON popular.sireid = s.pedigreeid
ORDER BY popular.numOffspring DESC

ORDER BY необходимо повторить во внешнем запросе, потому что вы не можете полагаться на порядок из подзапроса, который будет сохранен через JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...