Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [SQL] Ottimizzare una query

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  3. #3
    Creazione tabelle
    codice:
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  5. #5
    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 VVoVe: )
    Non riesco a pensare a qualche join per sparagnare un po' di query

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.