Aiuto Query!!!
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).
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
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?
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
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

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.
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 ???
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 ???
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.
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;
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;
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)
- 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)
Scusa ma non sono riuscito a capire quale sia il problema? Vuoi ottenere più di un valore tra i risultati?
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
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

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.
Ti ringrazio

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 );

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 );
Direi che potrebbe andare bene.