представление запроса postgresql: для каждого автора укажите общее число соавторов - PullRequest
0 голосов
/ 07 октября 2018

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

моя таблица базы данных будет иметь 2 столбца bookid и его соответствующих авторову каждого bookid может быть более одного автора, и каждый автор может написать более одной книги.

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

дляНапример, если book1 имеет author1, author2, author3 и book2 имеет author1, author2, author4, то у author 1 будет общее число соавторов 3

примечание, чтобы не удваивать счет одного автора.

все еще новичок в этом, пытался записать это как таблицу, но это было беспорядок.спасибо!

Пример данных:

( дБ <> скрипка )

person_id   person_name   book_id
2           B             1
3           C             2
4           D             2
5           E             2
3           C             3
4           D             3
6           F             3
4           D             4
8           H             4
9           I             4
10          J             4

Ожидаемый результат:

person_name   coauthors
B             0
C             3
D             6
E             2
F             2
H             3
I             3
J             3

пс: у меня примерно 2000+ строк авторов и bookid

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

demo: db <> fiddle

SELECT 
    a.person_name, 
    count(distinct b.person_id) - 1 as coauthors 
FROM authors a 
INNER JOIN authors b 
ON a.book_id = b.book_id
GROUP BY a.person_id, a.person_name
ORDER BY a.person_name

INNER JOIN для самой таблицы на их book_id s создает строки, с которыми связан каждый автор определенной книгидруг с другом.Например, для book_id = 2 создаются пары

(C, C),
(C, D),
(C, E),
(D, C),
(D, D),
(D, E),
(E, C),
(E, D),
(E, E)

Это делается для каждого book_id.Теперь мы можем GROUP по идентификатору автора (person_id), который дает, например, для D: (C, D, E) (и всех других соавторов из других книг).

Потому что, например, совокупностьдля D и все его книги выглядят как (C, D, E, C, D, F, D, H, I, J), мы должны отфильтровывать каждое удвоенное значение.Это то, что DISTINCT делает.

Теперь это выглядит как (C, D, E, F, H, I, J), что делает счет 7.Напоследок мы не хотим считать самого автора.Вот почему мы в конце вычитаем 1.


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

0 голосов
/ 07 октября 2018

Предполагая таблицу Books(author1, ... author4, bookid, ...), где некоторые из значений author* могут быть нулевыми.В качестве альтернативы вспомогательная таблица BookAuthors(bookid, author) допускает произвольное количество авторов, а также более простой запрос

Это выглядит грязно, но использует UNION (не UNION ALL), делая неявное DISTINCT.

select first, count(distinct second)
from (select author1 first, author2 second from Books union
      select author1, author3 from Books union
      select author1, author4 from Books union
      select author2, author1 from Books union
      select author2, author3 from Books union
      select author2, author4 from Books union
      select author3, author1 from Books union
      select author3, author2 from Books union
      select author3, author4 from Books union
      select author4, author1 from Books union
      select author4, author2 from Books union
      select author4, author3 from Books
) coauthors where first is not null and second is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...