Newsgroup: it.comp.software.database
Titolo: problema di query

Mi scuso se sono off-topic ma non ci sono, mi pare, gruppi specifici per
l'sql.
La situazione: Database di eventi legati alla musica (canzoni,
immagini, video)
3 tabelle
ARTISTI (id_artista, nome, naz)
EVENTI (id_evento, titolo, tipo, id_artista, id_album)
ALBUM (id_album, titolo, anno)
La tabella album l'ho introdotta per evitare di avere informazioni
replicate nella tabella eventi. Il mio problema pero' sono le query:
vorrei permettere agli utenti di ricercare una stringa nel titolo o nel
nome dell'autore. Il risultato dovrebbe essere una tabella che mi riporta:
tipo---autore---titolo_evento---titolo_album
Non riesco a fare query che uniscano eventi che hanno un album relativo ed
eventi che non l'hanno.
La query tipo (generata attraverso un form php) dovrebbe essere piu' o
meno
SELECT evento.tipo, artista.nome, evento.titolo, album.titolo FROM evento,
artista, album WHERE (evento.titolo~*'$stringa', AND
evento.id_artista=artista.id_artista AND album.id_album=evento.id_album);
Ovviamente mi restituisce solo i record che hanno un album corrispondente,
ma non tutti (esempio le immagini) ce l'hanno. L'unica soluzione che per
ora ho trovato e' quella di creare un album di id=0 senza titolo ne' nulla
che viene associato agli eventi privi di album... ma non mi pare una gran
soluzione... Qualsiasi suggerimento e' realmente molto gradito. Grazie e
ciao!

Quello che stai cercando di fare e' una Outer Join, cioe' una Join che
unisce tutti i record di una tabella e tutti i record corrispondenti di
un'altra, ma della prima tira dentro tutti i record anche se non hanno
record corrispondenti.
Il problema e' che la sintassi della Outer Join e' dipendente dal database
che stai usando.
Con Oracle si indica la join aggiungendo un + prima della tabella "joinata":
SELECT X, Y FROM TAB1, TAB2 WHERE 
TAB1.ID
 += 
TAB2.ID
Con SQL Server si usa LEFT JOIN/RIGHT JOIN...
Quindi come vedi la cosa dipende dal database su cui stai lavorando.
Dato pero' che (a quanto ho capito) per ogni EVENTO c'e' un solo ALBUM o
nessuno, forse ti conviene spostare i due campo Titolo ed Anno dentro la
tabella EVENTI ed evitare il problema.
Davide
"striscio" <giar...@NOO.it> wrote in message
news:8gdqnl$9u7$1...@fe2.cs.interbusiness.it...


ma non tutti (esempio le immagini) ce l'hanno
Se non ho capito male, il seguente statement dovrebbe fare al caso tuo:
SELECT evento.tipo, artista.nome, evento.titolo, album.titolo
FROM evento
JOIN artista ON evento.id_artista = artista.id_artista
LEFT JOIN album ON evento.id_album = album.id_album
WHERE evento.titolo~*'$stringa'
che, per gli eventi non legati all'album, ti restituisce comunque il
corrispondente record con il campo album.titolo a NULL
Saluti

 corrispondente record con il campo album.titolo a NULL
Provero' appena possibile...
secondo te funziona anche su un database come postgres?
Grazie e ciao!

 WHERE evento.titolo~*'$stringa'
Ho provato ma il postgres non supporta gli OUTER JOIN...
che si puo' fare?

 e' dipendente dal database che stai usando.
E mi sa che postgresql non supporta gli outer join...





 Con SQL Server si usa LEFT JOIN/RIGHT JOIN...
Postgres non supporta (ancora) i join... ma sono riuscito a risolvere
cosi' (lo posto cosi' magari a qualcuno serve...
---------------CUT---------------------------
SELECT artista.nome,  evento.id_evento, evento.titolo, evento.tipo, 
album.titolo as titolo_album from evento, album, artista
WHERE (artista.nome ~* 'gob' OR evento.titolo~*'gob') AND
album.id_album=evento.id_album  AND artista.id_artista = evento.id_art
UNION
select artista.nome, evento.id_evento, evento.titolo, evento.tipo,
evento.id_album from album, evento, artista
where (artista.nome ~* 'gob' OR evento.titolo~*'gob')
AND evento.id_art = artista.id_artista AND evento.id_evento
NOT IN
(select evento.id_evento from evento where evento.id_album IS NOT
NULL)
----------------------------------
In questo modo nella colonna titolo_album viene restituito
il titolo se c'e' e il numero di riferimento (che e' NULL) per 
le canzoni non legate ad alcun album.
Grazie ancora e ciao!