PDA

Visualizza la versione completa : [SQL] Ottimizzare una query


Andrechan
22-01-2009, 16:52
Salve a tutti :)
Ho un problema
Ho due tabelle, Utenti e Posizioni.
Ogni utente ogni tanto invia la sua posizione alias viene aggiunta una nuova row a Posizioni (idutente, latitudine, longitudine e timestamp)
Devo fare un metodo che prenda tutte le ultime posizioni degli utenti che si trovano in una certa area.

Per ora faccio una prima query che si prende tutti gli utenti , poi per ogni utente faccio una query che si prende l'ultima posizione e verifico che sia in quell'area.
Ma il mio programma deve essere ottimizzato al max e mi sa che sto abbondando troppo di query . Esiste un metodo + semplice e veloce?

Uso MySql 5.0

123delphi321
22-01-2009, 17:10
ciao,

sarebbe meglio se tu postassi ( ??? non so se e' il verbo giusto! ), la struttura delle tabelle.

ad occhio io farei una query tale da selezionare solo i record di quell'area, ma non so come fare per selezionare quell'area.....

posta le tabelle, e le query che hai fatto

Andrechan
22-01-2009, 17:44
Creazione tabelle


CREATE TABLE `defaultds`.`users` (
`idUtente` int(10) unsigned NOT NULL auto_increment,
`name` varchar(45) default NULL,
PRIMARY KEY (`idUtente`)
) ENGINE=InnoDB AUTO_INCREMENT=9540 DEFAULT CHARSET=latin1;


CREATE TABLE `defaultds`.`positions` (
`idUtente` int(10) unsigned NOT NULL auto_increment,
`timeInserted` timestamp NOT NULL default CURRENT_TIMESTAMP,
`latitudine` float NOT NULL,
`longitudine` float NOT NULL,

PRIMARY KEY USING BTREE (`idUtente`,`timeInserted`),
CONSTRAINT `FK_Posizioni_1` FOREIGN KEY (`idUtente`) REFERENCES `users` (`idUtente`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=929 DEFAULT CHARSET=latin1;d

Query:

1) select * from users
2) per ogni utente
"select * from Position p where p.idUtente= "+idUtente+" order by timeInserted desc limit 1"
Cosė ottengo un solo record per quell'utente. su quel record controllo poi latitudine e longitudine. Se va bene inserisco l'utente in un array

123delphi321
22-01-2009, 17:54
Query:

1) select * from users
2) per ogni utente
"select * from Position p where p.idUtente= "+idUtente+" order by timeInserted desc limit 1"
Cosė ottengo un solo record per quell'utente. su quel record controllo poi latitudine e longitudine. Se va bene inserisco l'utente in un array


penso che possa andare, ma potresti risparmiare lavoro inserendo una condizione per lat a long

select * from Position p
where p.idUtente= "+idUtente+"
and latitudine=lllll and longitudine=ttttt
order by timeInserted desc limit 1

Andrechan
22-01-2009, 18:01
Grazie per la risposta
anche se credo cosė mi ritornerebbe l'ultima posizione che si trova in quell'area (e che magari č del giorno prima :oVVoVe: )
Non riesco a pensare a qualche join per sparagnare un po' di query :(

123delphi321
22-01-2009, 18:33
scusa, ma nella where inserisci anche una condizione di riferimento alla data.....

comunque, cerca di fare query con parametri esterni.

premetto che non conosco il tuo SQL ma suppongo che, supporti le stored procedure. ne potresti scrivere una cosi ti semplifichi la vita

Loading