Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di imydal
    Registrato dal
    Sep 2002
    Messaggi
    76

    [MYSQL] Select di un massimo e della data del record

    Ciao a tutti,

    premetto che sto cercando di imparare in questi giorni. Ho un DB che interfaccio via PHP per selezionare alcune informazioni meteorologiche.
    Nel dettaglio devo creare una SELECT che mi permetta di estrarre da un db le informazioni per esempio della temperatura max di un giorno e l'orario rispettivo contenuto nello stesso record.
    Per esempio con la query
    Codice PHP:
    SELECT max(`temperature`) , `time
    FROM `meteo
    WHERE `day` =08
    AND `month` =01
    AND `year` =2015 
    ottengo un dato corretto per il valore della temperatura, ma errato per l'orario:
    codice:
    max(`temperature`) time
    8.5 00:00:12
    Ho modificato la query in:
    Codice PHP:
    SELECT `temperature` , `time
    FROM `meteo
    WHERE `day` =08
    AND `month` =01
    AND `year` =2015
    AND `temperature` = ( 
    SELECT MAX( `temperature` ) 
    FROM `meteo
    WHERE `day` =08
    AND `month` =01
    AND `year` =2015 
    GROUP BY `temperature
    Ottenendo:
    codice:
    8.5 06:27:47
    Se inserisco un GROUP BY per temperatura risolvo il problema? come faccio a tirare fuori la rispettiva data più piccola?
    In realtà quello è il dato corretto, ma non sono certo che sia il metodo più giusto per avere il primo record con la temperatura più bassa, in quanto se elimino il group by vedo tutti i record con la stessa temperatura e ripetuti per ogni orario.


    Grazie Andrea

  2. #2
    La seconda query è corretta ed è l'unico modo che hai per tirare fuori la temperatura MAX di una data giornata e poi riportare anche l'orario in cui è stata registrata.
    Il group by serve in combinazione con le funzioni di aggregazione (nel tuo caso MAX) per sapere su quale campo aggregare (da li il nome) il dato della funzione.

    Non ho capito la domanda sulla data più piccola

  3. #3
    Più che la max, devi usare una top 1 (o limit per mysql) order by temperatura desc

  4. #4
    Utente di HTML.it L'avatar di imydal
    Registrato dal
    Sep 2002
    Messaggi
    76
    Quote Originariamente inviata da nicolabiondo Visualizza il messaggio
    La seconda query è corretta ed è l'unico modo che hai per tirare fuori la temperatura MAX di una data giornata e poi riportare anche l'orario in cui è stata registrata.
    Il group by serve in combinazione con le funzioni di aggregazione (nel tuo caso MAX) per sapere su quale campo aggregare (da li il nome) il dato della funzione.

    Non ho capito la domanda sulla data più piccola
    Effettivamente non mi sono spiegato bene... Intendevo dire che se non utilizzo il GROUP BY la query estrae un sacco di righe moltiplicando tutti gli orari nei quali la temperatura era al Max. La mia domanda é capire se il GROUP BY estrae correttamente il primo valore in ordine di orario, in quanto é da considerarsi temperatura massima la prima volta che la temp raggiunge il massimo, anche se poi rimane fissa in quel valore per n ore.

    con il GROUP BY risolvo quindi il problema.?

  5. #5
    Utente di HTML.it L'avatar di imydal
    Registrato dal
    Sep 2002
    Messaggi
    76
    Quote Originariamente inviata da optime Visualizza il messaggio
    Più che la max, devi usare una top 1 (o limit per mysql) order by temperatura desc
    Riusciresti a postarmi la query per favore? Non sono molto esperto e non so come utilizzare TOP o limit.

    grazie Andrea

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Select temp, time from tab where "i parametri che vuoi" order by temp desc limit 1

  7. #7
    Utente di HTML.it L'avatar di imydal
    Registrato dal
    Sep 2002
    Messaggi
    76
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Select temp, time from tab where "i parametri che vuoi" order by temp desc limit 1
    Da quanto ho potuto provare credo che la query più corretta sia questa:
    Codice PHP:
    SELECT `temperature` , `time` , `datetimeFROM `meteo
    WHERE `day` =08
    AND `month` =01
    AND `year` =2015
    AND `temperature` = ( 
    SELECT MAX( `temperature` ) 
    FROM `meteo
    WHERE `day` =08
    AND `month` =01
    AND `year` =2015 
    GROUP BY `time
    LIMIT 1 

    Se eseguo quella da te indicata:

    Codice PHP:
    SELECT `temperature` , `time` , `datetime
    FROM `meteo
    WHERE `year` =2015
    AND `day` =08
    AND `month` =01
    ORDER BY 
    `temperatureDESC 
    LIMIT 1 
    Il risultato è il medesimo

    Credo che logicamente sia più corretto ordinare per orario e poi mostrare solo la prima riga anziché ordinare per temperatura in maniera decrescente, in quanto non capisco se venga tirata fuori la prima per orario oppure no. Corretto?

    Oppure è più efficiente fare come da te suggerito?
    Grazie ancora
    Andrea
    Ultima modifica di imydal; 09-01-2015 a 14:00

  8. #8
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    se ordini per temperatura e prendi il primo record avrai la temperatura massima (in base ai parametri che scegli) correlata all'orario esatto in cui è stata registrata

    se la stessa temperatura si verifica in più orari, devi scegliere tu cosa fare... ad esempio, se vuoi l'orario massimo ordina anche per orario desc, se vuoi il minimo inverti l'ordinamento
    Ultima modifica di clasku; 09-01-2015 a 14:11

  9. #9
    usa la query con order by, non quella con group by

  10. #10
    Utente di HTML.it L'avatar di imydal
    Registrato dal
    Sep 2002
    Messaggi
    76
    Quote Originariamente inviata da optime Visualizza il messaggio
    usa la query con order by, non quella con group by
    Mi sono accorto adesso che se uso la query con il group by esce correttamente la temperatura max di oggi alle ore 15.59
    mentre se uso la query con l'order by la temperatura massima è la medesima, ma l'orario non è il più piccolo, ma quello delle ore 16.01 e tra l'altro questo valore cambia spesso.

    Mi sapete spiegare perchè? credo sia più affidabile la prima con la query annidata.
    Grazie
    Andrea

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.