V I S U A L I Z Z A D I S C U S S I O N E |
supernova87 |
Inserito il - 30/08/2008 : 16:00:06 ciao ragazzi, ho risolto per esercizio gli appelli di laboratorio di gennaio e febbraio, perciò posterò qui le soluzioni così chi ha ancora problemi con mysql 5 può dare un'occhiata ai punti che non riesce a svolgere. Le soluzioni le ho testate e funzionano, tranne quelle in cui ho specificato di non averle testate.
A voi:
Appello del 16 gennaio 2008 ESERCIZIO 1) CREATE TABLE Filiali ( Nro_filiale char(1), Nome_filiale char(20), Sede_filiale char (20), Nro_dipendenti integer, PRIMARY KEY (Nro_filiale) );
ALTER TABLE Scorte ADD FOREIGN KEY (Nro_filiale);
ESERCIZIO 2) INSERT INTO Filiali VALUES ('1','Henrys Downtown','16 Riverview',10); INSERT INTO Filiali VALUES ('2','Henrys On The Hill','1289 Bedford',6); INSERT INTO Filiali VALUES ('3','Henrys Brentwood','Brentwood Mall',15); INSERT INTO Filiali VALUES ('4','Henrys Eastshore','Eastshore Mall',9);
ESERCIZIO 3) SELECT * FROM Filiali WHERE Nro_dipendenti<10;
ESERCIZIO 4) SELECT Titolo_libro, Cognome_autore, Nome_autore FROM Libri,Autori,LibriAutori WHERE Libri.Codice_libro=LibriAutori.Codice_libro AND LibriAutori.Nro_autore=Autori.Nro_autore;
ESERCIZIO 5) CREATE VIEW TipoLibro_at_HenrysDowntown AS SELECT Tipo_libro, Nome_filiale FROM Libri,Filiali,Scorte WHERE Libri.codice_libro=Scorte.codice_libro AND Scorte.Nro_filiale=FIliali.Nro_filiale AND Scorte.nro_filiale='1';
ESERCIZIO 6) per quanto riguarda questo esercizio ho capito che bisognerebbe contare il numero dei tipi di libro e poi contarne quelli con il numero massimo, facendo questo con una query annidata. Io sono riuscito solo a contarli in questo modo:
SELECT Tipo_libro, COUNT(Tipo_libro) AS Numero_tipi FROM TipoLibro_at_HenrysDowntown GROUP BY Tipo_libro;
Un amico mi ha suggerito la seguente soluzione che non ho ancora provato però: SELECT MAX(Conta) FROM ( SELECT COUNT(*) AS Conta FROM TipoLibro_at_HenrysDowntown GROUP BY Tipo_libro);
Se ci sono errori scriveteli per tutti. In serata posterò le altre soluzioni. Ciao e buono studio. |
16 U L T I M E R I S P O S T E (in alto le più recenti) |
Paki |
Inserito il - 15/09/2008 : 17:48:58 Mi sa tanto che domani ci sara da divertirsi |
noname |
Inserito il - 15/09/2008 : 17:39:14 Vedo che anche tu condividi le mie perplessità!
Negli esempi la prof quando crea viste usa l'asterisco e quindi lascia sempre tutti i campi. Se non lo facesse la query successiva si complicherebbe di molto, e come dici tu non avrebbero senso le richieste di dopo.
Mah! :D |
Paki |
Inserito il - 15/09/2008 : 13:58:31 Non ne ho la piu pallida idea...per quanto riguarda l'uso del DISTINCT in quella query non avrebbe senso dato che successivamente l'esercizio chiede di contare le occorrenze... cmq piu di una volta mi è capitato di vedere che il penultimo esercizio è ambiguo!!
esempio:
Citazione:
[punti 6] Creare una vista LibriInVendita_HenrysEastshore che elenchi i titoli dei libri in vendita presso la filiale Henrys Eastshore
La prima cosa che mi viene in mente è di generare una vista in cui ci sono solo I TITOLI!!!
poi dopo chiede:
Citazione:
[punti 6] Trovare i libri, fra quelli in vendita nella filiale Henrys Eastshore, del tipo 'NAR' (query sulla vista LibriInVendita_HenrysEastshore).
Questo lascia intendere che nella vista voleva anche il tipo di libro!!
ufff
Abbasso le ambiguità |
noname |
Inserito il - 15/09/2008 : 12:52:51 Citazione: Messaggio inserito da Paki
Si si! Grande!!!
Io alla fine c'ero riuscito cosi:
SELECT Tipo_libro, count(*) as Numero FROM TipoLibro_at_henrysdowntown GROUP BY Tipo_libro HAVING Numero=(SELECT MAX(temp.quantita) FROM (SELECT count(*) as quantita FROM TipoLibro_at_henrysDowntown Group by tipo_libro) as temp);
credo sia simile come cosa...
Sisi è identica, solo al posto di usare la WHERE usi l'HAVING (che vabbè è pensata per filtrare ulteriormente i record dopo aver usato la WHERE). Cmq nella mia query c'è un tipo_libro inutile ;)
Quindi diventa:
SELECT tipo_libro FROM
(
SELECT tipo_libro, Count(tipo_libro) AS "num" FROM tipi GROUP BY tipo_libro
)
AS a
WHERE num =
(
SELECT MAX(num) FROM
(
SELECT Count(tipo_libro) AS "num" FROM tipi GROUP BY tipo_libro
)
AS b
)
Yo! Domani è il giorno della verità
Una domandina: nella vista ci sono le categorie di libri ma ognuna è ripetuta più volte se ci sono più libri di quella categoria. E questo è il motivo per cui riusciamo a fare l'esercizio successivo: contiamo quale categoria compare più di tutte. Però in realtà sarebbe più corretto creare la vista con la clausola DISTINCT. Solo che così si perde l'informazione della quantità...
La prof (che come sapete è imprevedibile) come valuta queste cose?
So di per certo che ci sono alcune cose che fanno alzare la valutazione, tipo rinominare i campi di una select, ordinare, a volte anche reperire campi che non sono strettamente necessari. Voi come vi siete comportati? (Voi o amici/parenti che hanno dato il lab :) )
|
Paki |
Inserito il - 15/09/2008 : 12:04:59 Si si! Grande!!!
Io alla fine c'ero riuscito cosi:
SELECT Tipo_libro, count(*) as Numero FROM TipoLibro_at_henrysdowntown GROUP BY Tipo_libro HAVING Numero=(SELECT MAX(temp.quantita) FROM (SELECT count(*) as quantita FROM TipoLibro_at_henrysDowntown Group by tipo_libro) as temp);
credo sia simile come cosa... |
noname |
Inserito il - 14/09/2008 : 23:44:51 La famosa soluzione all'esercizio 6
SELECT tipo_libro FROM
(
SELECT tipo_libro, Count(tipo_libro) AS "num" FROM tipi GROUP BY tipo_libro
)
AS a
WHERE num =
(
SELECT MAX(num) FROM
(
SELECT tipo_libro, Count(tipo_libro) AS "num" FROM tipi GROUP BY tipo_libro
)
AS b
)
|
Paki |
Inserito il - 31/08/2008 : 18:57:07 cmq io per oggi mi fermo!! Tu l'esame ce l'hai domani, giusto? In bocca al lupo... (quasi quasi vengo vedere!!!) buh...vediamo un po... |
Paki |
Inserito il - 31/08/2008 : 18:54:14 Gia!! e la cosa piu brutta è che non ho la piu pallida idea di cosa cavolo possa essere lo scritto!!! Il LAB bene o male penso di riuscirci!! HELPPPPPPPPPPPPPP!!! |
supernova87 |
Inserito il - 31/08/2008 : 18:53:26 caro paki, sembra che a farlo siamo rimasti noi 2...poveri noi... |
Paki |
Inserito il - 31/08/2008 : 18:48:48 Citazione: in quanto tale, non è possibile determinarne la prima, la seconda...l'ultima.
beh in realta è possibile se si utilizzano ORDER DESC o ASC! la prima tupla sara sempre la piu ALTA in questo caso :) cmq dubito anch'io che l'accetti... ma quelli che hanno fatto gia sto esame come minkia hanno fatto? |
supernova87 |
Inserito il - 31/08/2008 : 18:45:47 non credo che l'accetterebbe...anche perchè ricorda che sql considera qualunque database come un INSIEME di tupre, ed, in quanto tale, non è possibile determinarne la prima, la seconda...l'ultima. Inoltre "l'ordinamento delle tuple non fa parte della definizione di una relazione, perchè una relazione tenta di rappresentare fatti a livello logico o astratto". wow...ma che mi son fumato per dare una risposta così? |
Paki |
Inserito il - 31/08/2008 : 18:17:25 Metodo un po grezzino ma funzionale e logico per la soluzione del quesito 6 della prova del 16/01:
mysql> SELECT tipo_libro, count(*) from tipolibro_at_henrysdowntown GROUP BY Tip
o_libro ORDER BY count(*) DESC LIMIT 1;
+------------+----------+
| Tipo_libro | count(*) |
+------------+----------+
| NAR | 3 |
+------------+----------+
1 row in set (0.00 sec)
In pratica l'interrogazione crea una tabella in cui ci sono i tipi di libri e la quantita presente, poi li ordina in maniera decrescente (dal piu presente al meno presente) e successivamente prende solo la prima tupla che ovviamente è il max!
Che ne dite? la prof.ssa Lisi lo accetterebbe?
Voi come fareste? |
supernova87 |
Inserito il - 31/08/2008 : 16:42:51 e come promesso...ecco la soluzione dell'appello del 13 febbraio 2008:
# Esercizio 1) ALTER TABLE Scorte ADD FOREIGN KEY(Nro_filiale) REFERENCES Filiali(Nro_filiale);
# Esercizio 2) UPDATE Filiali SET Nro_dipendenti=Nro_dipendenti-1 WHERE Nome_filiale='Henrys Brentwood';
# Esercizio 3) DELETE FROM Filiali WHERE Nro_filiale='5';
# Esercizio 4) SELECT SUM(Nro_dipendenti) FROM Filiali;
# Esercizio 5) SELECT Nome_filiale,Titolo_libro,Prezzo_libro FROM Libri,Scorte,FIliali WHERE Filiali.Nro_filiale=Scorte.Nro_filiale AND Libri.Codice_libro=Scorte.Codice_libro;
# Esercizio 6) CREATE VIEW LibriInVendita_HenrysEastshore AS SELECT Titolo_libro,Nome_filiale,Tipo_libro FROM Libri,Scorte,Filiali WHERE Filiali.Nro_filiale=Scorte.Nro_filiale AND Libri.Codice_libro=Scorte.Codice_libro AND Nome_filiale='Henrys Eastshore';
# Esercizio 7) SELECT Titolo_libro,Tipo_libro FROM LibriInVendita_HenrysEastshore WHERE Tipo_libro='NAR'; |
Paki |
Inserito il - 30/08/2008 : 18:21:48 Ah inoltre il punto numero 6 della stessa traccia probabilmente va fatto in un altro modo. Ho provato a cercare un po in giro e sono riuscito ad ottenere un risultato con questa query:
SELECT Tipo_libro, count(*) from tipolibro_at_henrysdowntown group by Tipo_libro having count(*) >= ALL(SELECT COUNT(*) from tipolibro_at_henrysdowntown group by Tipo_libro);
il risultato a schermo sara questo:
+------------+----------+
| Tipo_libro | count(*) |
+------------+----------+
| NAR | 3 |
+------------+----------+
1 row in set (0.13 sec)
|
Paki |
Inserito il - 30/08/2008 : 18:17:47 Esercizio 2 del 16/01
Citazione:
INSERT INTO Filiali VALUES ('1','Henrys Downtown','16 Riverview',10); INSERT INTO Filiali VALUES ('2','Henrys On The Hill','1289 Bedford',6); INSERT INTO Filiali VALUES ('3','Henrys Brentwood','Brentwood Mall',15); INSERT INTO Filiali VALUES ('4','Henrys Eastshore','Eastshore Mall',9);
si riassume in:
INSERT INTO Filiali VALUES ('1','Henrys Downtown','16 Riverview',10),('2','Henrys On The Hill','1289 Bedford',6),('3','Henrys Brentwood','Brentwood Mall',15),('4','Henrys Eastshore','Eastshore Mall',9);
:D |
supernova87 |
Inserito il - 30/08/2008 : 17:21:08 questa è la soluzione del 29 gennaio 2008, trovata in tempo di record:
ESERCIZIO 1) ALTER TABLE Scorte ADD FOREIGN KEY(Codice_libro) REFERENCES Libri(Codice_libri);
ESERCIZIO 2) UPDATE Filiali SET Nro_dipendenti=10 WHERE Nro_filiale='1';
ESERCIZIO 3) INSERT INTO Filiali VALUES ('4','Henrys Eastshore','Eastshore Mall',9);
ESERCIZIO 4) SELECT SUM(Nro_dipendenti) FROM Filiali;
ESERCIZIO 5) SELECT Titolo_libro,Nome_filiale FROM Libri,Scorte,Filiali WHERE Libri.Codice_libro=Scorte.Codice_libro AND Scorte.Nro_filiale=Filiali.Nro_filiale AND Nro_copie_disponibili>0;
ESERCIZIO 6) CREATE VIEW LibriDisponibili_HenrysEastshore AS SELECT Titolo_libro,Prezzo_libro,Nro_copie_disponibili FROM Libri,Scorte,FIliali WHERE Libri.codice_libro=Scorte.codice_libro AND Scorte.Nro_filiale=Filiali.Nro_filiale AND Nome_filiale='Henrys Eastshore';
ESERCIZIO 7) SELECT Titolo_libro, MIN(Prezzo_libro) AS Prezzo_minimo FROM LibriDisponibili_HenrysEastshore;
Adesso siccome mi sono rotto il ca22o, vuoi il caldo, vuoi la stanchezza, mi fermo. Accontentatevi di queste 2 soluzioni e domani posto l'altra. Ciao! |
|
|