n° 219
Novembre 2017
Dicembre 12, 2017, 09:49:28 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai gił
  Stampa  
Autore Discussione: Query... aeronautica che non decolla!  (Letto 3606 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Gioce90
Newbie
*

Karma: +0/-2
Scollegato Scollegato

Messaggi: 17


Mostra profilo
« inserita:: Settembre 20, 2013, 01:36:00 »

Salve! Ho un problemino che all'apparenza sembra semplice, ma č da un po' che ci sbatto la testa! xD

AEREOPORTO ( CITTA', Nazione, NumPiste)
VOLO (IDVOLO, GIORNSETT, CittąPart, OraPart,CittąDest, OraDest, TipoAereo)
AEREO (TIPOAEREO, NumPasseggeri, QtaMerci)

La query da creare č questa:
"per ciascuna cittą, il numero di voli in partenza dal suo aereoporto"

Avevo pensato di fare
Select A.Cittą, count(V.CittąPart)
From Aereoporto as A, Volo as V
Where A.Cittą=V.CittąPart;

ma non funzia! Una mano?
Registrato
DEV-01
Full Member
***

Karma: +11/-23
Scollegato Scollegato

Messaggi: 472

Me.Shift ^(n)


Mostra profilo E-mail
« Risposta #1 inserita:: Settembre 20, 2013, 02:58:58 »

Descrivi le tabelle e vediamo perché.
Proporre una query senza fornire la struttura sottostante č come voler guidare in formula uno essendo ciechi.
Registrato

01000100 01100101 01110110 00101101 00110000 00110001
Gioce90
Newbie
*

Karma: +0/-2
Scollegato Scollegato

Messaggi: 17


Mostra profilo
« Risposta #2 inserita:: Settembre 20, 2013, 03:36:17 »

CREATE DATABASE IF NOT EXISTS Voli;

USE Voli;

Drop table if exists Aereoporto;
Drop table if exists Volo;
Drop table if exists Aereo;

Create table Aereoporto(
Cittą varchar(30) Primary Key,
Nazione varchar(30),
NumPiste int(2) DEFAULT NULL
);

Create table Aereo(
TipoAereo int(4) Primary Key,
NumPasseggeri int(3) DEFAULT 0,
QtaMerci int(5) DEFAULT 0
);

Create table Volo(
IdVolo int(6) AUTO_INCREMENT,
GiornSett enum('LUN', 'MAR', 'MER', 'GIO', 'VEN', 'SAB', 'DOM'),
CittąPart varchar(30),
OraPart time,
CittąDest varchar(30),
OraDest time,
TipoAereo int(4),
Primary Key (IdVolo, GiornSett),
Foreign Key (TipoAereo) REFERENCES Aereo(TipoAereo)
);

Insert into Aereoporto values ("Bari","Italia",10);
Insert into Aereoporto values ("Roma","Italia",9);
Insert into Aereoporto values ("Milano","Italia",8);
Insert into Aereoporto values ("Napoli","Italia",7);
Insert into Aereoporto values ("Cagliari","Italia",12);
Insert into Aereoporto values ("Torino","Italia",NULL);
Insert into Aereoporto values ("Parigi","Francia",13);
Insert into Aereoporto values ("Londra","Inghilterra",8);
Insert into Aereoporto values ("Palermo","Italia",NULL);

Insert into Aereo values (0000, NULL, NULL);
Insert into Aereo values (1111, 100, 1000);
Insert into Aereo values (2222, 200, 2000);
Insert into Aereo values (3333, 300, 3000);
Insert into Aereo values (4444, NULL, NULL);
Insert into Aereo values (5555, NULL, NULL);
Insert into Aereo values (6666, NULL, NULL);
Insert into Aereo values (7777, 700, 7000);

Insert into Volo values (NULL, 'LUN', "Bari", 011500, "Andria", 012000, 0000);
Insert into Volo values (NULL, 'MAR', "Roma", 011500, "Milano", 011500, 0000);
Insert into Volo values (NULL, 'MER', "Milano", 011500, "Andria", 011500, 0000);
Insert into Volo values (NULL, 'GIO', "Napoli", 011500, "Andria", 011500, 0000);
Insert into Volo values (NULL, 'VEN', "Cagliari", 011500, "Andria", 011500, 0000);
Insert into Volo values (NULL, 'SAB', "Torino", 011500, "Milano", 011500, 1111);
Insert into Volo values (NULL, 'DOM', "Parigi", 011500, "Andria", 011500, 2222);
Insert into Volo values (NULL, 'LUN', "Londra", 011500, "Montaltino", 011500, 3333);
Insert into Volo values (NULL, 'MAR', "Roma", 011500, "Montaltino", 011500, 4444);
Insert into Volo values (NULL, 'MER', "Roma", 011500, "Parigi", 011500, 5555);
Insert into Volo values (NULL, 'GIO', "yyyyyy", 011500, "Montaltino", 011500, 6666);
Insert into Volo values (NULL, 'VEN', "xxxxxx", 011500, "Montaltino", 011500, 6666);
Insert into Volo values (NULL, 'SAB', "Bari", 011500, "Milano", 012000, 6666);
Registrato
DEV-01
Full Member
***

Karma: +11/-23
Scollegato Scollegato

Messaggi: 472

Me.Shift ^(n)


Mostra profilo E-mail
« Risposta #3 inserita:: Settembre 23, 2013, 04:36:29 »

Stavo leggendo un libro sugli antipattern in SQL e mi sono trovato faccia a faccia con la tua query!!
...Non era proprio la tua ma si presentava incredibilmente simile.

Quale risultato ottieni di preciso?

Intanto se vuoi prova cosģ:

Codice:
SELECT COUNT(cittąpart) FROM volo WHERE cittąpart IN (SELECT DISTINCT(cittąpart) FROM  volo) GROUP BY cittąpart ORDER BY cittąpart ASC

Non ho testato ma ti spiego la query:

Nelle query innestate vengono eseguite prima quelle interne e poi, a seguire, si procede verso l'esterno.
Con la prima query (quella interna) otteniamo dei valori univoci e distinti che indicano la cittą di ogni aereoporto; ossia una sola occorrenza per ogni valore differente indipendentemente dal numero di ripetizioni presenti nella colonna;

nella seconda utilizziamo i valori ottenuti (WHERE ... IN) raggruppandoli (GROUP BY) prima di contarli (COUNT).

Se non ottieni l'ordinamento desiderato elimina da ORDER BY in poi, ma puņ essere che DISTINCT ne operi gią uno automatico, adesso non ricordo bene.

La query opera su una sola tabella.

MySQL esegue tutto (in locale) in 0.00 sec.

Ti avviso che stai inserendo dei dati ridondanti nel database (= spreco sconsigliato + decremento prestazioni) il mio consiglio č quello di aggiungere una colonna "id" nella tabella "aereoporto" e inserire valore ivi contenuto nell'apposito campo della tabella "volo" utilizzando "aereoporto" come tabella di lookup.

Tieni sempre presente che il processore opera pił velocemente sui tipi numerici interi piuttosto che sulle stringhe.

PS: Ti sconsiglio di utilizzare valori NULL come predefiniti poiché impongono pesanti variazioni sui risultati ottenibili in molti casi (peraltro abbastanza noti) meglio specificare un valore di default che non possa mai rappresentare un dato reale (es. 'NEW', 0 o 'NULL' inteso come stringa vera e propria).
Registrato

01000100 01100101 01110110 00101101 00110000 00110001
straccia17
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 1


Mostra profilo E-mail
« Risposta #4 inserita:: Ottobre 03, 2013, 08:36:20 »

Ciao, la tua query č quasi corretta: quello che manca č la clausola di raggruppamento (group by).

Prova cosģ:
Codice:
Select A.Cittą, count(V.CittąPart)
From Aereoporto as A, Volo as V
Where A.Cittą=V.CittąPart
group by A.Cittą;

Il risultato dovrebbe essere quello desiderato. Occhio perņ che con il join stai escludendo dai risultati i voli in partenza da "xxxxx" e "yyyyyy"; con quest'altra query otterrai il conteggio di tutti i voli e puoi escludere un join che si rivela utile solo se ti servono informazioni provenienti dalla tabella Aereporto
Codice:
select v.`CittąPart`, count(*) as NUM_VOLI from volo v group by v.`CittąPart`;
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines