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

    Estrarre data minima e data massima per lo stesso utente e per lo stesso giorno

    Ciao a tutti,

    dovrei realizzare una query abbastanza complessa (almeno per me) per la verifica di dati presi da un timbratore,
    ho una lista di record composti da:

    ----------------------------------------------------------------------------------------------
    | ID | cognomeNome | numeroBadge | dataTransito | oraTransito | direzione |
    ----------------------------------------------------------------------------------------------
    | 1 | Pluto | 123456 | 2024-01-25 | 07:12:00 | 1 |
    | 2 | Pluto | 123456 | 2024-01-25 | 17:00:00 | 2 |
    | 3 | Pluto | 123456 | 2024-01-27 | 07:05:00 | 1 |
    | 4 | Pluto | 123456 | 2024-01-27 | 12:08:00 | 2 |
    | 5 | Pluto | 123456 | 2024-01-27 | 13:31:00 | 1 |
    | 6 | Pluto | 123456 | 2024-01-27 | 17:48:00 | 2 |
    ----------------------------------------------------------------------------------------------

    Dove direzione uguale a 1 equivale all'ingresso e uguale a 2 all'uscita.
    I record 1 e 2 equivalgono ad un ingresso ed una uscita "normale",
    i record 3, 4, 5 e 6 equivalgono a un ingresso, un uscita per andare a pranzo un ingresso al ritorno da pranzo e l'ucita per toranre a casa.

    Dovrei fare questo: trovare nei vari record l'ora minima e l'ora massima per lo stesso numero di badge e per lo stesso giorno.

    Esempio:
    per i record 1 e 2, il risultato dovrebbe essere:
    Pluto, il giorno 25 gennaio 2024 l'ora minima e' 07:12:00 e la massima 17:00:00.
    per i record 3, 4, 5 e 6:
    Pluto, per il giorno 27 gennaio 2024 l'ora minima 07:05:00 e la massima 17:48:00 (solo i record 3 e 6, saltando 4 e 5).

    Sto provando a utilizzare una query di questo tipo (senza ciclare e mettendo numero badge e giorno fisso per provare):


    Codice PHP:

    // ESTRAI ORA MIN E ORA MAX PER LO STESSO UTENTE E LO STESSO GIORNO
    $sql "SELECT id,numeroBadge,dataTransito,MIN(oraTransito) AS ora_minore,MAX(oraTransito) AS ora_maggiore FROM tabella WHERE numeroBadge = '123456' AND dataTransito = '2024-01-27' GROUP BY id, numeroBadge, dataTransito";
    $result $connAvanzamento->query($sql);

    while(
    $row $result->fetch_assoc()) {
                
        echo 
    "Badge: ".$row["numeroBadge"]." - Data: ".$row["dataTransito"]." - Ora minore: ".$row["ora_minore"]. "- Ora maggiore: ".$row["ora_maggiore"]."<br />";
        
    }

    $connAvanzamento->close(); 

    Pero' non riesco proprio a farla funzionare, come posso risolvere?


    Grazie per l'attenzione
    Ciao

  2. #2
    che vuol dire "non riesco proprio a farla funzionare"? Puoi essere un po' più preciso?

  3. #3
    codice:
    SELECT numeroBadge, dataTransito, MIN(oraTransito) as oraEntrata, MAX(oraTransito) as oraUscita
    GROUP BY numeroBadge, dataTransito
    Se metti GROUP BY id, ti verrà fuori una riga per record perchè id è univoco.

  4. #4
    Quote Originariamente inviata da filippo.toso Visualizza il messaggio
    codice:
    SELECT numeroBadge, dataTransito, MIN(oraTransito) as oraEntrata, MAX(oraTransito) as oraUscita
    GROUP BY numeroBadge, dataTransito
    Se metti GROUP BY id, ti verrà fuori una riga per record perchè id è univoco.

    E' vero, hai ragione, e infatti, corretta in questo modo:

    Codice PHP:

    SELECT numeroBadge
    cognomeNomedataTransitoMIN(oraTransito) AS ora_minimaMAX(oraTransito) AS ora_massima FROM tabella WHERE dataTransito '2024-01-09' AND numeroBadge '008850' 
    funziona a dovere !

    Grazie 1000 per l'aiuto

    Ciao

  5. #5
    Purtroppo continuo ad avere problemi nell'estrazione della totalita' dei record, ok per l'estrazione dell'ora minima e massima, stavo pero' provando con dati non dinamici, solo con un numero badge e data di transito fissa, ovviamente pero' nel db ci sono molte piu' righe con molti piu' utenti e relative date e ore di transito.

    ----------------------------------------------------------------------------------------------
    | ID | cognomeNome | numeroBadge | dataTransito | oraTransito | direzione |
    ----------------------------------------------------------------------------------------------
    | 1 | Pluto | 123456 | 2024-01-25 | 07:32:23 | 1 |
    | 2 | Pluto | 123456 | 2024-01-25 | 17:50:49 | 2 |
    | 3 | Pluto | 123456 | 2024-01-27 | 07:05:00 | 1 |
    | 4 | Pluto | 123456 | 2024-01-27 | 12:08:00 | 2 |
    | 5 | Pluto | 123456 | 2024-01-27 | 13:31:00 | 1 |
    | 6 | Pluto | 123456 | 2024-01-27 | 17:48:00 | 2 |
    | 7 | Pippo | 789012 | 2024-01-25 | 07:12:00 | 1 |
    | 8 | Pippo | 789012 | 2024-01-25 | 17:00:00 | 2 |
    | 9 | Pippo | 789012 | 2024-01-26 | 07:05:00 | 1 |
    | 10 | Pippo | 789012 | 2024-01-26 | 12:08:00 | 2 |
    | 11 | Pippo | 789012 | 2024-01-26 | 11:31:00 | 1 |
    | 12 | Pippo | 789012 | 2024-01-26 | 19:50:00 | 2 |
    | 12 | Minni | 345678 | 2024-01-26 | 09:31:00 | 1 |
    | 13 | Minni | 345678 | 2024-01-26 | 15:30:00 | 2 |
    ----------------------------------------------------------------------------------------------


    Pensavo di effettuare una query a monte e raggruppare tutti i numeriBadge e poi passarli alla query per selezionare uno ad uno, ma poi come fa a capire quando cambiare data ?

    In sintesi, con la query non dinamica mi da questo risultato (provando solo sui record 1 e 2):

    1 - PLUTO - 123456 - 2024-01-25 - Ora minima: 07:32:23 - Ora massima: 17:50:49


    Se invece provo a renderla dinamica, con una query a monte che mi raggruppa il numero di badge:

    Codice PHP:


    SELECT 
    FROM tabella GROUP BY numeroBadge 

    Mi conteggia solo un risultato (perche' ovvimente passo solo un numero di badge), io dovrei riuscire ad arrivare a un risultato del genere:


    1 - PLUTO - 123456 - 2024-01-25 - Ora minima: 07:32:23 - Ora massima: 17:50:49
    2 - PLUTO - 123456 - 2024-01-27 - Ora minima: 07:05:00- Ora massima: 17:48:00
    3 - PIPPO - 789012 - 2024-01-25 - Ora minima: 07:12:00- Ora massima: 17:00:00
    4 - PIPPO - 789012 - 2024-01-26 - Ora minima: 07:05:00- Ora massima: 12:08:00

    ecc...ecc...

    Inserisco la query su cui sto ragionando:

    Codice PHP:

    $sqlTotale 
    "SELECT * FROM tabella WHERE anno = $anno AND mese = $mese GROUP BY numeroBadge";            
    $queryTotale mysqli_query($connAvanzamento,$sqlTotale);

    while(
    $arrayTotale mysqli_fetch_assoc($queryTotale)) {

        
    $sql "SELECT id, numeroBadge, cognomeNome, dataTransito, MIN(oraTransito) AS ora_minima, MAX(oraTransito) AS ora_massima FROM tabella WHERE dataTransito = '$arrayTotale[dataTransito]' AND numeroBadge = '$arrayTotale[numeroBadge]'";
        
    $result $connAvanzamento->query($sql);

        if (
    $result->num_rows 0) {

            
    $row $result->fetch_assoc();
                        
            echo 
    "$row[id] - $row[cognomeNome] - $row[numeroBadge] - $row[dataTransito] - Ora minima: " $row["ora_minima"] . " - Ora massima: " $row["ora_massima"] . "<br>";

        } else {
                        
            echo 
    "Nessun risultato trovato";

        }




    Non saprei proprio come riuscire a raggruppare il numero di badge, pero' facendole passare il cambio di data.
    Ultima modifica di _Micky_73; 26-03-2024 a 13:28

  6. #6
    una semplice select con group by badge, data, con l'order by che desideri sarà sufficiente; non includere l'id, come già detto, e non mettere where

  7. #7
    Perfetto, cosi' funziona benissimo !!

    Alla fine la query corretta e' cosi':

    Codice PHP:

                
    // QUERY TOTALE
                
    $sqlTotale "SELECT * FROM tabella WHERE anno = $anno AND mese = $mese GROUP BY numeroBadge, dataTransito ORDER BY id ASC";            
                
    $queryTotale mysqli_query($connAvanzamento,$sqlTotale);
                
    $righeTotale mysqli_num_rows($queryTotale);
                while(
    $arrayTotale mysqli_fetch_assoc($queryTotale)) {

                    
    // QUERY SQL PER OTTENERE L'ORA MINIMA E MASSIMA PER LO STESSO GIORNO E LO STESSO NUMERO DI BADGE
                    
    $sql "SELECT id, numeroBadge, cognomeNome, dataTransito, MIN(oraTransito) AS ora_minima, MAX(oraTransito) AS ora_massima FROM tabella WHERE dataTransito = '$arrayTotale[dataTransito]' AND numeroBadge = '$arrayTotale[numeroBadge]'";
                    
    $result $connAvanzamento->query($sql);

                    if (
    $result->num_rows 0) {

                        
    $row $result->fetch_assoc();
                        
                        echo 
    "$row[id] - $row[cognomeNome] - $row[numeroBadge] - $row[dataTransito] - Ora minima: " $row["ora_minima"] . " - Ora massima: " $row["ora_massima"] . "<br>";

                    } else {
                        
                        echo 
    "Nessun risultato trovato";

                    }

                } 
    Grazie milla a entrambi per l'aiuto e sopratutto la pazienza !!
    Ciao

  8. #8
    per me fai dei giri inutili, basta una query (e senza l'id!). comunque, se a te va bene

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 © 2024 vBulletin Solutions, Inc. All rights reserved.