PDA

View Full Version : Chi sa fare questa query?


loris_p
10-08-2006, 04:15
Ciao a tutti,
avrei un quesito da porvi:
sto realizzando a tempo perso una piccola applicazione che si interfaccia ad un database mysql riguardante i miei films..
tra gli aspetti del programma c'è una pagina in cui vengono visualizzate varie statistiche, quali il numero di films, l'attore di cui possiedo più films, ed altre amenità simili)
il problema è questo:
desideravo fare una query che mi ritornasse il regista preferito..
questo deve essere ottenuto estraendo tra tutti i registi quello che ha il maggior numero di film con valutazione uguale a 5 (il massimo)
vi riporto un piccolo schema riassuntivo delle tabelle che servono per la query, premettendo che non avevo intenzione di utilizzare le viste..

film(id,regista*,....,voto)regista fk per la tabella registi
registi(id ,nome,cognome)

se mi sono scordato di qualche informazione fatemi sapere :)

mailand
10-08-2006, 08:18
se ho capito bene...

select regista, max(count(voto)) from film
where voto=5
group by regista

in oracle funziona, penso anche in mysql...
poi per la tabella regista fai una normale join...

loris_p
10-08-2006, 21:46
scusa se rispondo ora..
grazie per l'attenzione, purtroppo l'avevo già provata ma mysql non mi lascia annidare funzioni di raggruppamento, quindi max(count(xxxx)) non lo posso fare

Andrea16v
10-08-2006, 22:37
scusa se rispondo ora..
grazie per l'attenzione, purtroppo l'avevo già provata ma mysql non mi lascia annidare funzioni di raggruppamento, quindi max(count(xxxx)) non lo posso fare

Hai una versione 4.0.x ? Nel caso ti consiglio di aggiornare ad una più recente così puoi usare direttamente le sottoquery.. :)

loris_p
10-08-2006, 22:39
ho la 5..
proprio le sottoquery intendevo usare, ma non mi viene in mente una query decente :doh: :doh: :help: :help: :doh: :doh:

Andrea16v
10-08-2006, 22:55
A quest'ora non sono molto in forma e mi sa che c'è una soluzione più semplice! Comunque puoi creare una tabella temporanea di due colonne in cui visualizzi per ogni regista il numero di film con voto 5 stelle. Poi da questa tabella di appoggio estrai il massimo della colonna count, e fai il select di regista per quella tupla. :)

loris_p
10-08-2006, 23:00
che era l'idea che mi era venuta per fare la vista con la tabella intermedia che dicevi tu..
ma ora voglio provare a creare questa dannata tabella al volo provando una sottoselect, altrimenti mi rassegnerò a creare una vista :doh:

loris_p
11-08-2006, 00:06
ok me ne sono fatto una ragione.. ho creato una vista ed ho fatto la select sul massimo numero di cinque stelle linkando la tabella a quella dei registi..la soluzione indubbiamente più indolore..ora funziona a meraviglia..grazie a tutti :D :D :D :D

mailand
11-08-2006, 08:53
senza creare temporanei, ma con identico principio...
volendo potevi fare una query con la sintassi with, che mi sembra che la versione 5 di mysql accetti... esempio:


with
valutazione as (
select regista,
count(voto) voto
from film
where voto=5
group by regista),
regista as (
select id, nome, cognome from registi)
select all
regista,
nome,
cognome,
max(voto)
from regista, valutazione
where regista=id


è più complessa, ma la funzione della sintassi with è quella di creare dei temporanei assimilabili in tutto e per tutto a tabelle (difatti usi i nomi dei temporanei nella from), che poi il sistema rimuove automaticamente, senza dover ricorrere a viste o quant'altro
è una funzione nativa del db2, poi adottata da oracle e se non ho letto male anche da mysql nelle ultime versioni
ciao :)

loris_p
11-08-2006, 10:50
tra poco provo e ti so dire..grazie mille per la dritta del with intanto, che non conscevo affatto..

mailand
11-08-2006, 11:14
tra poco provo e ti so dire..grazie mille per la dritta del with intanto, che non conscevo affatto..
è una sintassi poco conosciuta ma molto pratica, anche perchè, lavorando con query molto complesse, ti permette di vericare l'esattezza dei singoli blocchi senza dover ricaricare intere tabelle, e di avere un'unica query anche per caricamenti da fonti etrogenee, mantenendo "pulita" la struttura del db da temporaneo o intermedi vari :)

anonimizzato
11-08-2006, 11:25
Interessante approfondirò anch'io questa cosa del WITH.:)

mailand
11-08-2006, 11:36
Interessante approfondirò anch'io questa cosa del WITH.:)
su internet basta cercare sql with clause e la documentazione è decisamente abbondante ed esaustiva ;)