Как я могу отобразить несколько полей из одного столбца в postgresql? - PullRequest
0 голосов
/ 03 апреля 2020

мой запрос

У меня есть база данных о фильмах. Каждый фильм имеет несколько продюсеров, актеров и может быть отнесен к нескольким жанрам. Я пытаюсь отобразить всю эту информацию.

Как мне изменить свой запрос, чтобы получить различную информацию, например, от a1.actor_id и a2.actor_id

Воспользуйтесь ссылкой, чтобы увидеть мой база данных на GitHub https://github.com/J4Mary/lesson11/blob/master/films13.sql

SELECT CONCAT(
    'Name: "',
    films.film_name,
    '" (', films.year, '). Rating: ',
    films.rating,
    ' Genre: ',
    g1.genre, ', ',
    g2.genre, ', ',
    g3.genre,
    '. Directors: ',
    p1.producer_name, ', ',
    p2.producer_name,
    '. Actors: ',
    a1.actor_name, ', ',
    a2.actor_name, ', ',
    a3.actor_name
) AS info 
FROM 
    films
    INNER JOIN s_film_genre ON (films.id_film=s_film_genre.film_id)
    INNER JOIN genres AS g1 ON (s_film_genre.genre_id=g1.genre_id)
    INNER JOIN genres AS g2 ON (s_film_genre.genre_id=g2.genre_id)
    INNER JOIN genres AS g3 ON (s_film_genre.genre_id=g3.genre_id)
    INNER JOIN s_film_producer ON (films.id_film=s_film_producer.id_film) 
    INNER JOIN producers AS p1 ON (s_film_producer.id_producer=p1.id_producer) 
    INNER JOIN producers AS p2 ON (s_film_producer.id_producer=p2.id_producer) 
    INNER JOIN s_film_actor ON (films.id_film=s_film_actor.id_film)
    INNER JOIN actors AS a1 ON (s_film_actor.id_actor=a1.id_actor)
    INNER JOIN actors AS a2 ON (s_film_actor.id_actor=a2.id_actor)
    INNER JOIN actors AS a3 ON (s_film_actor.id_actor=a3.id_actor);

1 Ответ

0 голосов
/ 03 апреля 2020

Когда вам нужно показать некоторые поля из разных записей и обработать их вместе, вы должны подумать об использовании агрегатных функций. В этом случае мы думали о GROUP_CONCAT из mysql, но в postgres такой функции нет, поэтому я нашел Функция ARRAY_AGG и ARRAY_TO_STRING для создания строки, а не массива.

ARRAY_AGG делает несколько копий внутри, когда он идет ко многим соединениям, но это позволяет использовать DISTINCT , поэтому это не проблема.

Наслаждайтесь!

SELECT 
    film_name,
    year,
    rating,
    ARRAY_TO_STRING(ARRAY_AGG(DISTINCT genre), ', ') AS genres,
    ARRAY_TO_STRING(ARRAY_AGG(DISTINCT producer_name), ', ') AS producers,
    ARRAY_TO_STRING(ARRAY_AGG(DISTINCT actor_name), ', ') AS actors
FROM
    films 
    INNER JOIN s_film_genre ON (id_film = film_id)
    INNER JOIN genres USING (genre_id)
    INNER JOIN s_film_producer USING(id_film)
    INNER JOIN producers USING(id_producer)
    INNER JOIN s_film_actor USING(id_film)
    INNER JOIN actors USING(id_actor)

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