non hai reso pubblico il risultato del tuo esercizio, ed a causa della tua perplessità,
ho pensato di dedicare qualche decina di minuti per illustrarti come "rendere facile la vita con le view" applicate al tuo esercizio
usando la notazione di mssql
ho creato UTENTE con 610 record, TEATRO con 30 record e ABBONAMENTO con 610 * 30 / 2 = 9150 record (con uno script php e un po' di "rand")
ho creato la view
Codice PHP:
CREATE VIEW tabellaunione AS SELECT
[u_codice] // chiave primaria della tabella utente
,[u_nome]
,[u_cognome]
,[u_eta]
,[t_nome] // chiave primaria della tabella teatro
,[t_citta]
,[t_capienza]
,[a_id]
,[a_codutente] // foreign key che lega l'utente
,[a_nometeatro] // foreign key che lega il teatro
,[a_costo]
FROM utente, teatro, abbonamento
WHERE a_codutente=u_codice AND a_nometeatro=t_nome
ho scritto la select per contare il totale degli abbonamenti (9150)
Codice PHP:
select sum(x.abbonamenti)
from (
select t_citta, count(*) as abbonamenti
from tabellaunione
group by t_citta
) x
ho scritto la select per contare gli abbonamenti per città, nella fascia d'età, ottenendone la lista ordinata
Codice PHP:
select t_citta, count(*) as abbonamenti
from tabellaunione
where u_eta between 18 and 25
group by t_citta
order by count(*) desc, t_citta
ho calcolato la graduatoria applicata alla select precedente
Codice PHP:
select x.t_citta, x.abbonamenti,
RANK() OVER ( ORDER BY x.abbonamenti DESC ) RankRes
from
(
select t_citta, count(*) as abbonamenti
from tabellaunione
where u_eta between 18 and 25
group by t_citta
) x
ho selezionato le città prime in classifica
Codice PHP:
select y.*
from
(
select x.t_citta, x.abbonamenti,
RANK() OVER ( ORDER BY x.abbonamenti DESC ) RankRes
from
(
select t_citta, count(*) as abbonamenti
from tabellaunione
where u_eta between 18 and 25
group by t_citta
) x
) y
where y.RankRes = 1
order by y.abbonamenti desc, y.t_citta
citta2-2 51 1
citta3-2 51 1
citta9-2 51 1
qualche considerazione,
le tabelle sono tutte relazionate con colonne indicizzate (in questo caso, ma dovrebbero esserlo sempre)
se non fossero indicizzate, si rischia la lettura sequenziale, con tempi biblici, sia con semplici select, sia con select...join, sia con view
nel caso in esame se "confronti bene", tutti i tipi di selezione citati, sono applicabili allo stesso modo
con gli stessi tempi di "elaborazione", essendo, i tipi citati, identici
(il pc con oltre 9 anni di onorato servizio, quindi non un ultimo grido, ha sempre indicato 00:00:00 come tempo di esecuzione, pur facendolo ripartire prima di ogni query)
il primo pensiero che avevo cercato di passarti é stato "guarda al futuro" sempre
il secondo che ti passo ora, tieni le "cose" nella forma più semplice possibile, aiuta molto
un ultimo pensiero per @optime, il tuo post era decisamente fuori tema e, visto che non lo hai ancora fatto, per favore rileggi il post iniziale e invia il tuo suggerimento,
quali ragionamenti fai per gestire "query così complesse" ?
spero di non aver annoiato nessuno
saluti