View Full Version : [MySQL] Aiuto: Query strana!
Helldron
14-01-2011, 14:45
Ciao a tutti,
forse la mia domanda è banale ed è più semplice di quello che penso però ho il seguente DB:
Canzone(titolo,cantante,anno_inc)
Trasmessa(radio: Radio(codice),canzone: Canzone(titolo),anno)
Radio(codice,descrizione)
e vorrei trovare: il titolo di tutte le canzoni che non sono state mai trasmesse.
In pratica dovrei prendere "Canzone.titolo" che però non ha nessuna occorrenza in "Trasmessa", cioè non compare mai una o più tuple con la canzone/i che vorrei e una radio che la trasmette.
Come posso fare??
Ciao a tutti,
forse la mia domanda è banale ed è più semplice di quello che penso però ho il seguente DB:
Canzone(titolo,cantante,anno_inc)
Trasmessa(radio: Radio(codice),canzone: Canzone(titolo),anno)
Radio(codice,descrizione)
e vorrei trovare: il titolo di tutte le canzoni che non sono state mai trasmesse.
In pratica dovrei prendere "Canzone.titolo" che però non ha nessuna occorrenza in "Trasmessa", cioè non compare mai una o più tuple con la canzone/i che vorrei e una radio che la trasmette.
Come posso fare??
Clausola Where con il count delle NON trasmesse (count == 0)
Clausola where IN (dove trasmesse NULL)
le due idee principali che mi sono venute in mente :D
Helldron
15-01-2011, 19:19
Clausola Where con il count delle NON trasmesse (count == 0)
Clausola where IN (dove trasmesse NULL)
le due idee principali che mi sono venute in mente :D
La seconda non si può fare, in "trasmesse" non ho valori null, se c'è una tupla implica che quella canzone è stata trasmessa, al più potrebbe non esserci l'anno!!
Per la prima se faccio
select c.titolo
from canzone c, trasmessa t
where count(t.canzone)==0 and
t.canzone=c.titolo;
non credo riesca a fare il join perchè non fa nessun match o sbaglio?
Questa sotto funzionerebbe?
select c2.titolo
from canzone c1, canzone c2, trasmessa t
where t.titolo=c1.canzone and
count(t.titolo)>0 and
c1.canzone<>c2.canzone;
Il <> vuol dire "diverso"
La seconda non si può fare, in "trasmesse" non ho valori null, se c'è una tupla implica che quella canzone è stata trasmessa, al più potrebbe non esserci l'anno!!
Per la prima se faccio
select c.titolo
from canzone c, trasmessa t
where count(t.canzone)==0 and
t.canzone=c.titolo;
non credo riesca a fare il join perchè non fa nessun match o sbaglio?
Questa sotto funzionerebbe?
select c2.titolo
from canzone c1, canzone c2, trasmessa t
where t.titolo=c1.canzone and
count(t.titolo)>0 and
c1.canzone<>c2.canzone;
Il <> vuol dire "diverso"
Conosco il simbolo <> :D.
Per quanto riguarda la seconda non la capisco sinceramente... :/
Helldron
15-01-2011, 20:23
Conosco il simbolo <> :D.
Per quanto riguarda la seconda non la capisco sinceramente... :/
Uso un doppio alias per la tabella canzone, dovrebbe, e sottolineo dovrebbe, prendere tutte le tuple con count>0 per le canzoni trasmesse (basta contare la chiave canzone) e fare join con la tabella 1 di "canzone", quindi prende tutte le canzoni nella tabella 2 diverse da quelle della tabella 1. Il dubbio sta in quel <> se mi prende quelle tuple che mi interessano!
In pratica lavora al contrario di come dici tu, prendo quello che NON voglio per trovare quello che mi interessa.
Kralizek
15-01-2011, 20:49
left join tra canzone e tramsessa e filtro sui null?
SELECT *
FROM
Canzone C
LEFT JOIN Trasmessa T ON C.Titolo = T.Canzone
WHERE
T.Anno IS NULL
edit il join su disuguaglianza non credo serva a qualcosa :)
Uso un doppio alias per la tabella canzone, dovrebbe, e sottolineo dovrebbe, prendere tutte le tuple con count>0 per le canzoni trasmesse (basta contare la chiave canzone) e fare join con la tabella 1 di "canzone", quindi prende tutte le canzoni nella tabella 2 diverse da quelle della tabella 1. Il dubbio sta in quel <> se mi prende quelle tuple che mi interessano!
In pratica lavora al contrario di come dici tu, prendo quello che NON voglio per trovare quello che mi interessa.
dovrebbe, appunto, non ne sono convinto, ma bisognerebbe provarla.
A rigor di logica non mi dice niente :|
La join left con il null era l'idea che ho dato io (magari l ho espressa male); teoricamente estrai tutto dove non c'è NULL, se non trova nella join non ritorna quei campi nella relazione
khelidan1980
16-01-2011, 18:44
Ma perchè vi rompete la testa? La soluzione classica è quella postata da Kralizek in un anno che faccio PL/SQL l'avrò usata un botto di volte
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.