Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327

    problema con group by in mysql

    ciao a tutti,

    ho un piccolo problema con il group by in mysql. mi spiego meglio

    ho una tabella di questo tipo

    id_movimento ip mac
    1 192.168.0.0 00:1c:b0:78:fc:0c
    2 192.168.0.0 00:1c:b0:78:fc:0c
    4 192.168.0.2 00:30:6e:c3:45:62
    5 192.168.0.0 00:1c:b0:78:fc:0c
    6 192.168.0.2 00:30:6e:c3:45:62
    7 192.168.0.0 00:1c:b0:78:fc:0c
    8 192.168.0.2 00:16:17:a6:68:0b
    7 192.168.0.0 00:14:a5:70:95:96



    se facciouna select del tipo

    select ip, mac from movimenti group by ip;

    lui mi trova

    192.168.0.0 = 00:1c:b0:78:fc:0c
    192.168.0.2 = 00:30:6e:c3:45:62

    invece a me servirebbe l'ultima riga del gruppo e quindi

    192.168.0.0 = 00:14:a5:70:95:96
    192.168.0.2 = 00:16:17:a6:68:0b

    ho fatto anche

    select ip, mac, max(id) from movimenti group by ip;

    e lui mi trova si l'id più grande ma mi stampa sempre gli stessi risultati

    7 - 192.168.0.0 = 00:1c:b0:78:fc:0c
    8 - 192.168.0.2 = 00:30:6e:c3:45:6


    esiste un modo per selezionare l'ultima riga di un gruppo??

  2. #2
    E se provi a mettergli un ORDER BY id DESC che ti esce?

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    mi stampa questo

    8 - 192.168.0.2 = 00:30:6e:c3:45:6
    7 - 192.168.0.0 = 00:1c:b0:78:fc:0c

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    in realtà la cosa è un po più complicata..
    ho realizzato un software che registra e il traffico generato da una rete suddiviso per subnet.... quindi per ogni subnet ho tutti gli ip ad esso assoiciati.

    la tabella è cosi composta

    sul db ho il traffico generato

    id_movimento---- ip ----------------------mac-------------------id_rete
    1 ----------------192.168.0.1------------ 00:1c:b0:78:fc:0c-----192.168.0.0
    2 ----------------192.168.0.1 ------------00:1c:b0:78:fc:0c-----192.168.0.0
    4 ----------------192.168.0.2------------ 00:30:6e:c3:45:62-----192.168.0.0
    5 ----------------192.168.0.1------------ 00:1c:b0:78:fc:0c-----192.168.0.0
    6 ----------------192.168.0.2------------ 00:30:6e:c3:45:62-----192.168.0.0
    7 ----------------192.168.0.1------------ 00:1c:b0:78:fc:0c------192.168.0.0
    8 ----------------192.168.0.2------------ 00:16:17:a6:68:0b------192.168.0.0
    7 ----------------192.168.0.1------------ 00:14:a5:70:95:96 -----192.168.0.0

    8 ----------------192.168.1.1------------ 00:1c:b1:78:fc:0c-----192.168.1.0
    9 ----------------192.168.1.1 ------------00:1c:b1:78:fc:0c-----192.168.1.0
    10 ----------------192.168.1.2------------ 00:20:7e:c3:45:62-----192.168.1.0
    11 ----------------192.168.1.1------------ 00:1c:b1:78:fc:0c-----192.168.1.0
    12 ----------------192.168.1.2------------ 00:20:7e:c3:45:62-----192.168.1.0
    13 ----------------192.168.1.1------------ 00:1c:b1:78:fc:0c------192.168.1.0
    14 ----------------192.168.1.2------------ 00:16:19:b6:68:0b------192.168.1.0
    15 ----------------192.168.1.1------------ 00:20:a5:71:95:96 -----192.168.1.0

    io dovrei fare una select del tipo

    SELECT ip, id_rete, max(id_movimento), mac FROM movimenti group by id_rete, ip;

    quindi deve prima raggrupparmi per id di rete dopo per ip, ma in questo modo ottengo

    1 ----------------192.168.0.1------------ 00:1c:b0:78:fc:0c-----192.168.0.0
    4 ----------------192.168.0.2------------ 00:30:6e:c3:45:62-----192.168.0.0
    8 ----------------192.168.1.1------------ 00:1c:b1:78:fc:0c-----192.168.1.0
    10 ----------------192.168.1.2------------ 00:20:7e:c3:45:62-----192.168.1.0

    invece vorrei ottenere

    7 ----------------192.168.0.1------------ 00:14:a5:70:95:96 -----192.168.0.0
    8 ----------------192.168.0.2------------ 00:16:17:a6:68:0b------192.168.0.0
    15 ----------------192.168.1.1------------ 00:20:a5:71:95:96 -----192.168.1.0
    14 ----------------192.168.1.2------------ 00:16:19:b6:68:0b------192.168.1.0

    se invece faccio

    SELECT ip, id_rete, max(id_movimento), mac FROM movimenti group by id_rete, ip order by id_movimento DESC;

    ottengo questo

    10 ----------------192.168.1.2------------ 00:20:7e:c3:45:62-----192.168.1.0
    8 ----------------192.168.1.1------------ 00:1c:b1:78:fc:0c-----192.168.1.0
    4 ----------------192.168.0.2------------ 00:30:6e:c3:45:62-----192.168.0.0
    1 ----------------192.168.0.1------------ 00:1c:b0:78:fc:0c-----192.168.0.0

  5. #5
    il group by serve a raggruppare e non a scegliere un valore che non hai nel raggruppamento (id_movimento) .... e poi il raggruppamento prende il primo record che trova fisicamente nella tabella che soddisfa la richiesta. la query va vista diversamente.

    Prova ad esempio:

    codice:
    SELECT id_movimento, ip, mac, id_rete
    FROM movimenti 
    WHERE id_movimento IN(SELECT MAX(id_movimento)
                                    FROM movimenti
                                    group by id_rete, ip)
    order by id_rete, ip
    eventualmente cambia l'order by o il group by secondo il tuo bisogno.

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    ho provato a utilizzare questa soluzione ma la ricerca è interminabile considerando che attualmente nel db ho 422000 record... figuriamoci quando ce ne sarranno molti di più.. non esiste un'altra soluzione??

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.