Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    138

    [MySql] COUNT e ultimo record nel GROUP BY

    Buongiorno a tutti

    forse è banale. ma non sono riuscito né trovato.

    ho una tabella delle modifiche su alcuni documenti.

    |id | idDoc |Data |idUtente
    |1 | 451 |2011-03-25 14:50:37|1
    |2 | 451 |2011-03-28 17:46:12|3
    |3 | 452 |2011-03-29 10:38:59|1
    |4 | 452 |2011-03-29 10:48:59|3
    |5 | 452 |2011-03-29 10:58:10|4

    dovrei estrarre tutte le informazioni dell'ultima occorrenza per ciascun idDoc, nonché il conteggio per quel medesimo idDoc.

    mi aspetto una cosa del tipo

    id | idDoc |Data |idUtente |conteggio
    2 | 451 |2011-03-25 14:50:37|3 |2
    5 | 452 |2011-03-29 10:58:10|4 |3

    mi sono bloccato sul fatto che, quando raggruppo, sia per il conteggio sia per estrarre la MAX(dataModifica) si "dimentica" di prendere idUtente corretto, ma prende il primo del raggruppamento: in pratica vedo sempre uscire come idUtente '1'

    grazie

  2. #2
    E' assolutamente corretto. Nei raggruppamenti, compreso il DISTINCT, viene preso il primo record fisicamente trovato nella tabella che soddisfa la richiesta.

    Prova a selezionare il max(id) con una subquery

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

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select t1.*,t2.conteggio from tabella as t1
    inner join (
    select iddoc,max(data) as data,count(*) as conteggio
    from tabella
    group by iddoc) as t2
    on t1.iddoc = t2.iddoc and t1.data = t2.data
    Aggiungi un indice alla tabella

    codice:
    alter table tabella add index i (iddoc,data)

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    138
    Originariamente inviato da piero.mac
    E' assolutamente corretto. Nei raggruppamenti, compreso il DISTINCT, viene preso il primo record fisicamente trovato nella tabella che soddisfa la richiesta.

    Prova a selezionare il max(id) con una subquery
    risolto. grazie. dopo aver postato il 3D ho continuato ad provare, ed ho lambito la soluzione cercando di sfruttare appunto, il MAX(id).

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    138
    Originariamente inviato da nicola75ss
    codice:
    select t1.*,t2.conteggio from tabella as t1
    inner join (
    select iddoc,max(data) as data,count(*) as conteggio
    from tabella
    group by iddoc) as t2
    on t1.iddoc = t2.iddoc and t1.data = t2.data
    Aggiungi un indice alla tabella

    codice:
    alter table tabella add index i (iddoc,data)
    grazie mille. come ho scritto qui sopra stavo approssimandomi alla soluzione. voi avete spalancato la porta.
    una domanda: pare che funzioni anche senza aggiungere l'indice alla tabella.
    a cosa serve? l'indice, intendo.

    grazie

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    L'indice serve per velocizzare le ricerche. Evidentemente hai pochi record nella tabella e quindi ancora non ne apprezzi i benefici.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    138
    Originariamente inviato da nicola75ss
    L'indice serve per velocizzare le ricerche. Evidentemente hai pochi record nella tabella e quindi ancora non ne apprezzi i benefici.
    sì. ho pochi campi, ancora.
    sì. la mia ignoranza è sconfinata

    grazie ancora.

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.