Aiuto Query!!!

pac_man1
Ciao,
mi potete aiutare a risolvere la query in SQL, avendo il seguente schema di basi di dati???

ATTORE (codAttore, cognome, nome, dataNascita)
SPETTACOLO (codSpettacolo, nomeSpettacolo, descrizione, durata, genere, regista, anno)
PARTECIPAZIONE (codAttore, codSpettacolo, ruolo)
RAPPRESENTAZIONE (codSpettacolo, data, numeroSpettatori)

Vincoli:
codAttore di Partecipazione con codAttore di Attore
codSpettacolo di Partecipazione con codSpettacolo di Spettacolo
codSpettacolo di Rappresentazione con codSpettacolo di Spettacolo

- Scrivere una query SQL che visualizzi l'attore che ha partecipato a meno spettacoli di tipo 'Tragedia' (codAttore, nome, cognome, dataNascita).

Risposte
apatriarca
Sono anche ammessi attori che non hanno partecipato a spettacoli di tipo 'Tragedia' o si vuole estrarre l'attore che ha partecipato meno tra quelli che hanno partecipato a tragedie? 'Tragedia' va letto dal campo genere?

pac_man1
Ciao, grazie per aver risposto.
Sulla tua prima domanda, l'esercizio non dava nessuna specifica comunque credo che bisogna escludere gli attori che non hanno partecipato a nessun spettacolo di tipo Tragedia... E poi come pensavi tu, Tragedia va letto dal campo Genere....
Grazie ancora :)

apatriarca
Puoi iniziare cercando di scrivere una query che estrae tutti gli attori che hanno partecipato ad una tragedia ordinandoli per il numero di tragedie e aggiungere la richiesta che vuoi solo un valore in uscita (usando LIMIT per esempio). Se questa query è ancora troppo complicata inizia a scrivere una query in cui estrai tutte le coppie di attori e spettacoli in cui il genere sia una tragedia. A questo punto sarà necessario raggruppare per attore (sommando il numero di righe in cui compare) e ordinare tale query rispetto al numero appena calcolato.

pac_man1
Hai ragione ora ci provo:
SELECT A.codAttore, A.cognome, A.nome, A.dataNascita, COUNT(*)
FROM ATTORE A, PARTECIPAZIONE P, SPETTACOLO S
WHERE A.codAttore = P.codAttore AND
P.codSpettacolo = S.codSpettacolo AND
S.genere = 'Tragedia'
GROUP BY A.codAttore, A.cognome, A.nome, A.dataNascita;

In questo modo per ogni attore ottengo il numero di spettacoli di Tragedia a cui ha partecipato... Il problema è come faccio a non portarmi il numero di Spettacoli???
E poi ci sarebbe un modo di farla senza utilizzare il Groub BY ???

apatriarca
Perché non vuoi usare GROUP BY? L'idea sarebbe quella di usare ORDER BY COUNT(*) insieme a GROUP BY e limitare l'output ad una sola riga con LIMIT 1.

pac_man1
Quindi dovrei fare cosi:
SELECT A.codAttore, A.cognome, A.nome, A.dataNascita
FROM ATTORE A, PARTECIPAZIONE P, SPETTACOLO S
WHERE A.codAttore = P.codAttore AND
P.codSpettacolo = S.codSpettacolo AND
S.genere = 'Tragedia'
GROUP BY A.codAttore, A.cognome, A.nome, A.dataNascita
ORDER BY COUNT(*)
LIMIT 1;

pac_man1
Il problema di fare la query in questo modo è:
- se per caso ci sono più attori che hanno partecipato a meno spettacoli di tipo Tragedia, con LIMIT 1 prende solo il primo scartando i successivi.
Non ci sarebbe un modo per evitare il Group By facendo la query su più livelli??? (Nidificata)

apatriarca
Scusa ma non sono riuscito a capire quale sia il problema? Vuoi ottenere più di un valore tra i risultati?

pac_man1
Esatto... Potrebbero esserci.
Pensa ad esempio che fra tutti gli attori ce ne siano due che hanno partecipato allo stesso numero di Spettacoli di tipo Tragedia, e che questo numero sia effettivamente il minimo.
La Query dovrebbe restituire entrambi gli attori e non uno solo di essi.
Spero di essere stato più chiaro.
A me hanno suggerito di evitare il Group By ma non capisco come.
Ciao :)

apatriarca
Non è chiaro il senso di "evitare il Group By" in quanto viene usato per contare il numero di spettacoli per attore e non ha nulla a che fare con la restituzione di un certo numero di valori con lo stesso numero di spettacoli. Esistono in effetti altri metodi per ottenere lo stesso risultato e più tardi (ora sono a lavoro e ho poco tempo per pensarci) provo a fornirti una soluzione alternativa.

pac_man1
Ti ringrazio :)

pac_man1
Ciao :)
ho trovato un modo per farla, secondo te si può migliorare?

SELECT A.*
FROM ATTORE A, PARTECIPAZIONE P, SPETTACOLO S
WHERE A.codAttore = P.codAttore AND
P.codSpettacolo = S.codSpettacolo AND
S.genere = 'Tragedia'
GROUP BY A.codAttore, A.cognome, A.nome, A.dataNascita
HAVING COUNT(*) <= ALL ( SELECT COUNT(*)
FROM PARTECIPAZIONE P1, SPETTACOLO S1
WHERE S1.genere = 'Tragedia' AND
S1.codSpettacolo = P1.codSpettacolo
GROUP BY P1.codAttore );

apatriarca
Direi che potrebbe andare bene.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.