MYSQL Relazione molti a molti

venerdì 12 ottobre 2007 - 23.44

illusione Profilo | Junior Member

Salve

ho una tabella (dvd) collegata ad un'altra tabella (attori) e una terza che fa

da ponte alle prime due (attori_dvd)

Vorrei selezionare un attore digitando il nome ma sono riuscito

solo ad raggrupparle.

SELECT dvd.Titolo, dvd.Anno, dvd.Durata, GROUP_CONCAT(attori.nome ORDER BY attori.nome ASC SEPARATOR ', ') AS attori FROM dvd INNER JOIN attori_dvd ON dvd.ID = attori_dvd.ID_DVD INNER JOIN attori ON attori_dvd.ID_ATTORI = attori.ID GROUP BY dvd.id ORDER BY dvd.Titolo

vorrei passargli un parametro per la ricerca del nome

ma se aggiungo where (attori.nome like :nome)

va in errore.

alx_81 Profilo | Guru

>Salve
Ciao
>
>ho una tabella (dvd) collegata ad un'altra tabella (attori) e
>una terza che fa da ponte alle prime due (attori_dvd)
>
>Vorrei selezionare un attore digitando il nome ma sono riuscito solo ad raggrupparle.
Allora, se vuoi selezionare un attore (ad esempio Tom Hanks) ed i suoi DVD in base al nome devi fare:

SELECT d.Titolo , d.Anno , d.Durata , a.Nome AS Attore FROM Attori AS a INNER JOIN Attori_Dvd AS ad ON ad.ID_ATTORI = a.ID INNER JOIN Dvd as d ON d.ID = ad.ID_DVD WHERE a.Nome = 'Tom Hanks' ORDER BY d.Titolo

In questo modo ottieni una riga per DVD. Considera inoltre che puoi utilizzare l'operatore LIKE al posto dell'uguale nella WHERE per scrivere condizioni come "Il cui nome comincia per" o "finisce con" o "contiene".. Nell'esempio, una query che ricerca tutti i dvd degli attori il cui nome comincia per "T"

SELECT d.Titolo , d.Anno , d.Durata , a.Nome AS Attore FROM Attori AS a INNER JOIN Attori_Dvd AS ad ON ad.ID_ATTORI = a.ID INNER JOIN Dvd as d ON d.ID = ad.ID_DVD WHERE a.Nome LIKE 'T%' ORDER BY d.Titolo

Per il passaggio di parametri hai provato il carattere "?" al posto dei ":"?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

illusione Profilo | Junior Member

anzitutto grazie!

ok funziona mi trova l'attore con i suoi film, ma

vorrei anche che mi vengano visualizzati anche

gli altri attori di quel film?

alx_81 Profilo | Guru

>ok funziona mi trova l'attore con i suoi film, ma
>vorrei anche che mi vengano visualizzati anche
>gli altri attori di quel film?
In quel caso devi fare la ricerca per titolo di DVD. Nell'esempio hai tutti gli attori di Matrix:

SELECT d.Titolo , d.Anno , d.Durata , a.Nome AS Attore FROM Attori AS a INNER JOIN Attori_Dvd AS ad ON ad.ID_ATTORI = a.ID INNER JOIN Dvd as d ON d.ID = ad.ID_DVD WHERE d.Titolo = 'Matrix' ORDER BY a.Nome


Alx81 =)

http://blogs.dotnethell.it/suxstellino

illusione Profilo | Junior Member

forse mi sono spiegato male.

quando faccio la ricerca per attore esempio Sylvester Stallone e mi vengono visualizzati i suoi film vorrei anche
gli altri attori che hanno collaborato con lui nel film.

Se nella ricerca troverò il film Cobra che ha fatto Stallone dovrei trovare anche Brigitte Nielsen e cosi via.

grazie sempre

alx_81 Profilo | Guru

>quando faccio la ricerca per attore esempio Sylvester Stallone
>e mi vengono visualizzati i suoi film vorrei anche
>gli altri attori che hanno collaborato con lui nel film.
>
>Se nella ricerca troverò il film Cobra che ha fatto Stallone
>dovrei trovare anche Brigitte Nielsen e cosi via.
Con la query seguente hai tutti i dvd di Stallone con i collaboratori. E' sufficiente rieseguire la JOIN ancora sulla Attori_Dvd e sulla Attori, per riottenere il legame.

SELECT d.Titolo , d.Anno , d.Durata , a2.Nome AS Attore FROM Attori AS a1 INNER JOIN Attori_Dvd AS ad1 ON ad1.ID_ATTORI = a1.ID INNER JOIN Dvd AS d ON d.ID = ad1.ID_DVD INNER JOIN Attori_Dvd AS ad2 ON ad2.ID_DVD = d.ID INNER JOIN Attori AS a2 ON ad2.ID_ATTORI = a2.ID WHERE a1.Nome = 'Sylvester Stallone' ORDER BY d.Titolo

In questo modo hai su più righe tutti gli attori di un film in base all'attore cercato.

>
>grazie sempre
di nulla!
>
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino

illusione Profilo | Junior Member

grazie ancora.
Funziona alla grande.
L'ultima cosa tanto per essere pignolo.
E' possibile avere restituito una solo record con gli attori
inseriti tutti nella stessa colonna?

ciao

alx_81 Profilo | Guru

>grazie ancora.
>Funziona alla grande.
>L'ultima cosa tanto per essere pignolo.
>E' possibile avere restituito una solo record con gli attori
>inseriti tutti nella stessa colonna?
Se hai un applicativo, ti conviene gestirlo da codice. Magari ciclando il resultset.
Però la soluzione c'è anche su DB. In SQL Server puoi farti una funzione che ti torna la colonna con l'elenco degli attori, però con MySQL non ti so dire con sicurezza se si può nello stesso modo. Tempo fa ho letto di una funzione (che tu usi all'inizio di questo post) che è la GROUP_CONCAT.
Prova a mettere al posto di a2.Nome, GROUP_CONCAT(a2.Nome ORDER BY a2.Nome SEPARATOR ', ') AS Attori e il tutto dovrebbe funzionare:

SELECT d.Titolo , d.Anno , d.Durata , GROUP_CONCAT(a2.Nome ORDER BY a2.Nome SEPARATOR ', ') AS Attori FROM Attori AS a1 INNER JOIN Attori_Dvd AS ad1 ON ad1.ID_ATTORI = a1.ID INNER JOIN Dvd AS d ON d.ID = ad1.ID_DVD INNER JOIN Attori_Dvd AS ad2 ON ad2.ID_DVD = d.ID INNER JOIN Attori AS a2 ON ad2.ID_ATTORI = a2.ID WHERE a1.Nome = 'Sylvester Stallone' ORDER BY d.Titolo

>ciao
Ciao!
Accetta le risposte di prima, se ritieni che ti siano state di aiuto, così chiudiamo il thread. Grazie.
Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5