Relation N-to-N - How to join two fields in a Postgresql record -

Asked

Viewed 377 times

2

In a N-to-N relationship I have three tables "book", "author" and "author book". The following data and structures:

tblLivro:

id_livro | nomelivro
'1'      ; 'O Cortiço'
'2'      ; 'O mulato'
'3'      ; 'Quimica Geral'

tblAuthor

id_autor | nomeautor
'1'      ; 'Aluísio Azevedo'
'2'      ; 'John C. Kotz'
'3'      ; 'Paul M. Treichel'
'4'      ; 'Gabriela C. Weaver'

tblLivro_Author

id_livro_autor | id_livro | id_autor. 
'1'            ; '1'      ; '1'
'2'            ; '2'      ; '1' 
'3'            ; '3'      ; '2' 
'4'            ; '3'      ; '3' 
'5'            ; '3'      ; '4'

I would like to make a search that would return the following resutlado:

Livro           | Autor
'O Cortiço'     ; 'Aluísio Azevedo'
'O mulato'      ; 'Aluísio Azevedo'
'Quimica Geral' ; 'John C. Kotz, Paul M. Treichel, Gabriela C. Weaver'

When I use the following SQL command:

Select tblLivro.nomelivro, tblAutor.nomeautor, 
from tblLivro
left outer join tblLivro_Autor on tblLivro.id_livro=tblLivro_Autor.id_livro
left outer join tblAutor on tblLivro_Autor.id_autor=tblAutor.id_autor

The book Quimica Geral appears three times (a registrar for each author).

1 answer

0


To add the value of several rows in a column you can use the function string_agg() which is equivalent to Mysql group_concat

SELECT livro.nome_livro, string_agg(autor.nome_autor,',') FROM livro as l
LEFT OUTER JOIN livro_autor as la ON l.id_livro = la.id_livro
LEFT OUTER JOIN autor as a ON la.id_autor = a.id_autor
GROUP BY l.nome_livro

Example - sqlfiddle

Browser other questions tagged

You are not signed in. Login or sign up in order to post.