Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Discussione: query difficile

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536

    query difficile

    Ciao a tutti
    allora ho una tabella in un db mysql così strutturata:

    id_user
    username
    ip
    data

    che memorizza gli accessi degli utenti alla propria pagina web,
    una cosa del tipo:

    1 - ciccio - 625.12.... - 25 April 2005, 5:40 pm
    2 - mario - 627.12... - 25 April 2005, 6:40 pm
    3 - pino - 555.22... - 26 april 2005, 6:01 pm
    2 - mario - 627.12... - 26 april 2005, 8:30 pm
    1 - ciccio - 625.12.. - 27 april 2005, 10:10 am
    ecc ecc

    adesso sto provando a scrivere una pagina in php che dovrebbe
    visualizzare per ogni utente il suo ultimo accesso
    e relativo ip associato alla data

    quindi ad esempio per l'utente ciccio sara:

    ciccio 625.12.. - 27 april 2005, 10:10 am

    per l'utente mario invece sarà ad esempio:

    mario - 627.12... - 26 april 2005, 8:30 pm

    (stampati in questo modo in ordine alfabetico per ciò
    che riguarda gli username e di data per
    quanto riguarda l'ultimo accesso del singolo utente)

    Il problema è che non so come scrivere la query
    che dovrebbe quindi permettere
    di stampare l'username dell'utente in ordine alfabetico
    rispetto agli altri con associato l'ip e la data
    relativo al suo ultimo accesso alla pagina.
    Non so se sono stato chiaro (ma credo proprio di si:-))

    Mi potete aiutare?
    grazie anticipatamente.

  2. #2
    Utente di HTML.it L'avatar di geko
    Registrato dal
    Dec 2004
    Messaggi
    104
    SELECT id_user, username, ip, MAX(data) FROM <nome_tabella> GROUP BY id_user ORDER BY username

  3. #3
    prova così:
    Codice PHP:
    select usernameipmax(datafrom tabella group by username order by username
    ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    [supersaibal]Originariamente inviato da alcatraz69
    prova così:
    Codice PHP:
    select usernameipmax(datafrom tabella group by username order by username
    ciao [/supersaibal]



    HO fatto così:

    $query = "SELECT id_user, username, IP, MAX(visit) FROM visite GROUP BY id_user ORDER BY username";
    $esegui = mysql_query($query);
    while ($result = mysql_fetch_array($esegui)) {
    $dat=$result[visit];
    $visita=date("j F Y, g:i a",$dat);
    echo "<TR>
    <TD>
    $result[id_user]
    </TD>
    <TD>
    $result[username]
    </TD>
    <TD>
    $result[IP]
    </TD>
    <TD>$visita</TD></TR>
    ";
    }

    ma mi restituisce questo ad esempio:

    7 luca 127.0.0.1 1 January 1970, 1:00 am

    Che c'entra 1 January 1970, 1:00 am?
    se ometto il MAX ottengo la data più o menoa attuale
    ma non la più grande. Come mai?

    ah il campo della data è del tipo:
    Visit int(11) not null
    Grazie

  5. #5
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Metti

    MAX(visit) as visit

    P.S.: non è detto che l'ip e username che ti trova quella query siano quelli giusti.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    [supersaibal]Originariamente inviato da Teuzzo
    Metti

    MAX(visit) as visit

    P.S.: non è detto che l'ip e username che ti trova quella query siano quelli giusti. [/supersaibal]


    :master: :master: :master:

    scusa , come sarebbe a dire.
    Non ho capito, vuoi dire che non si può fare quello di cui parlavo sopra.

    Mi sembra che molti progetti (phpbb2) o pagine php
    mostrino date di ultimo acceso di utenti, ultime modifiche ecc
    ecc). Ho dato pure un'occhiata ad alcune pagine di questi lavori
    ma il codice è incomprensibile (per me ovviamente).
    e non sono riuscito a trovare quello che mi interessava.
    ciao e grazie

  7. #7
    [supersaibal]Originariamente inviato da alcatraz69
    prova così:
    Codice PHP:
    select usernameipmax(datafrom tabella group by username order by username
    ciao [/supersaibal]
    sono un pò a secco di sql, mi potete spiegare questa?

    group by username

    grazie

  8. #8
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    La query

    SELECT id_user, username, IP, MAX(visit) FROM visite GROUP BY id_user ORDER BY username

    prima raggruppa gli id_user e poi per ognuno trova il massimo valore nell'attribuito visit.
    Però gli altri due attributi (username e IP) possono essere non corretti perchè ambigui.
    Supponi ad esempio di avere i seguenti dati:

    id_user, username, IP, visit
    1, pippo, 123, 123456
    1, totol, 456, 123456

    Avresti due record corrispondenti al max(visit), però con valori di username e IP diversi.
    Come può fare la scelta il db? Non sa che username e id_user sono legati, questo lo sai solo tu.
    Dovresti fare 2 query, con la prima ti trovi l'id_user e con la seconda username e IP in base all'id trovato.
    Oppure con una sola query con un join tra la tabella e se stessa.

  9. #9
    Diciamo che GROUP BY preleva il primo record che soddisfa la condizione del raggruppamento. Il campo MAX(visit) diventa una colonna a se stante con il valore piu' alto di visit (cos'e' una data? unix timestamp?)

    Quindi id_user e username si presumono siano univoci... cioe' che ad ogni username corrisponda un id_user che verrebbero quindi selezionati in ogni caso da group by, mentre altra storia e' per l'IP che sara' quello del primo record che soddisfa GROUP BY e non quello di MAX(visit). Oppure potrebbe anche esserlo, ma solo per questione di mera casualita' e non per la specifica richiesta .

    Potesti provare ad aggiungere HAVING in modo da forzare la scelta sul record con piu' alto valore di visit... esempio da provare ovviamente...
    codice:
    SELECT id_user, username, 
    IP, MAX(visit) AS last 
    FROM visite 
    GROUP BY id_user 
    HAVING visit = MAX(visit)
    ORDER BY username

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    ciao

    questa modifica mi sembra che vada bene
    ma l'ho provata solo in locale (quindi ottengo sempre lo stesso IP)

    $query = "SELECT MAX(id_visite)as id_visite,id_user, username, IP, MAX(visit)as visit FROM visite GROUP BY id_user ORDER BY username";

    che ne dite?

    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.