Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [MySQl] Group by

  1. #1

    [MySQl] Group by

    Salve

    chiedo aiuto al forum... ho terminato tutti i tentativi di mia conoscenza.

    Il problema è con la Group by, in pratica ho una serie di record con ora inizio, ora fine, nome

    10:00 11:00 piero
    10:30 11:00 piero
    08:00 08:30 pippo
    08:00 09:00 pippo
    10:00 11:00 pippo
    07:00 08:00 franco
    07:30 08:00 franco
    07:00 07:30 franco
    10:30 11:00 franco

    avrei bisogno di contare i nomi e l'ora intera di persone selezionate con impegni che iniziano o finiscono nella mezz'ora.

    Un esempio dovrebbe chiarire la questione:
    franco ha 3 impegni con la mezz'ora, pippo 1 e piero non selezionato
    franco 2 07
    franco 1 10
    pippo 1 08

    ho scritto questa query nella migliore delle intenzioni

    select count(*) as sono , nome, substr(ora_da,0,2) as ora from impegni
    group by nome, substr(ora_da,0,2)
    having (nome= 'pippo' or nome= 'franco')
    and (substr(ora_da,4,2)='30' or substr(ora_a,4,2)='30')

    a cui seguono messaggi di errore o risultati errati

    Grazie per eventuali suggerimenti

  2. #2
    Dovresti specificare il formato con cui memorizzi l'ora.

    Tieni presente che ogni giorno le ore si ripetono e quindi l'deale sarebbe utilizzare NOW() campo datetime yyyy-mm-dd hh:mm:ss
    Altra indicazione: la selezione dei record dovresti farla con il where e non con having. Il where riduce la selezione ai nomi cercati mentre having seleziona sull'intero risultato della select.

    Altro: semplificando (nome or nome) and (30 or 30) escludono le ore intere quindi non pesca 07:00 o 08:00 sarebbe meglio usare between es:

    where (nome= 'pippo' or nome= 'franco') AND tua_data_ora between data_inizio and data_fine

    Ovviamente sono indicazioni di massima da adattare alla struttura della tua tabella.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Quote Originariamente inviata da piero.mac Visualizza il messaggio
    Ovviamente sono indicazioni di massima da adattare alla struttura della tua tabella.
    Ciao e grazie per la risposta

    alla fine ho scelto la soluzione più semplice, una query senza raggruppamenti, con il massimo delle selezioni per ridurre i record, conteggio nel ciclo.

    Sicuramente non è il metodo migliore ma al momento è quello che da risultati.

    Dettagliando meglio il problema la data e l'ora sono nel formato yyyy-mm-dd e HH:MM:SS e quello che serve è il conteggio dei partecipanti ad un corso che può avere lezioni di un'ora (es. 10:00-11:00) o di mezz'ora (es. 09:30-10:00) da qui gli strani test sulla presenza del 30 nell'ora d'inizio o di fine.

    Quote Originariamente inviata da piero.mac Visualizza il messaggio
    Altra indicazione: la selezione dei record dovresti farla con il where e non con having.
    Usando Group by penso che funzioni solo having con where mi dava errore di sintassi, non ho approfondito più di tanto...

  4. #4
    Il where da errore di sintassi perche' viene risolto PRIMA dell'elenco dei campi e quindi non puo' utilizzare cose che sono risolte dopo.

    in ordine viene risolto per primo il nome tabella/e, poi le condizioni del where a seguire le definizioni dei campi e viene raccolto un result set a cui si applica il group by e le condizioni having

    quindi nel tuo caso l'ordine corretto sarebbe:

    select
    from
    where i nomi
    group by nomi, ora - e' il risultato di substr(ora_da,0,2) as ora, qui puoi anche usare l'alias 'ora' ormai definito
    having le ulteriori condizioni che saranno applicate solo al result set e non alla tabella intera

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    ... e luce fu!!!

    ho ripreso i pezzi della query postata sopra e rimessi nel dovuto ordine e voilà.

    grazie...

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.