Visualizzazione risultati 1 fino 9 di 9

Discussione: come fare una query complessa

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito come fare una query complessa

    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
    Guest

    Predefinito

    non è proprio il massimo della chiarezza comunque

    ordinati per username
    SELECT * FROM tabella ORDER BY username ASC
    con i successivi fetch del risultato

    per quanto riguarda la data ti conviene salvarla nel db sottoforma di unix timestamp, per permettere i confronti (leggiti un po l'uso della funzione time() dal manuale del php)

    e quindi usare la query

    SELECT * FROM tabella ORDER BY data ASC

    mavericck

  3. #3
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da mavericckweb
    non è proprio il massimo della chiarezza comunque

    ordinati per username
    SELECT * FROM tabella ORDER BY username ASC
    con i successivi fetch del risultato

    per quanto riguarda la data ti conviene salvarla nel db sottoforma di unix timestamp, per permettere i confronti (leggiti un po l'uso della funzione time() dal manuale del php)

    e quindi usare la query

    SELECT * FROM tabella ORDER BY data ASC

    mavericck

    grazie innanzitutto

    la ricerca e la stampa devono essere fatte insieme, quindi credo che sia
    neccessario usare una sola query
    che deve ordinare contemporaneamente i risultati prima per user (preso una sola volta)
    e poi ad ogni user l'ultimo accesso

    scusami pensavo che fosse abbastanza chiara la cosa
    gli esempi che mi hai fatto sopra (anche se non conosco bene il php e il myql
    e tendo a dimenticare le cose anche più banali) sono relativi a due query semplici che avrei saputo mettere insieme comunque.
    ciao e grazie ancora

  4. #4
    Guest

    Predefinito

    O non ho capito bene io, oppure il problema non sussiste.
    Tu memorizzi solo una volta ogni user?
    E quindi aggiorni la data del record relativo a quell'user, giusto?
    Quindi ti basta estrarre tutti gli user e relativa data!

    Se non ho capito bene allora spiega meglio!


    Ciaooooo!!!!!!!

  5. #5
    Guest

    Predefinito

    capito....
    però rendi più semplice la cosa, soprattutto per quanto riguarda lo sforzo del db

    nella query di inserimento record fai un controllo se l'username esista già, nel qual caso lo sovrascrivi, così avrai un solo record per ogni user
    la query di estrazione poi sarà semplicemente un singolo ordinamento

    mavericck

  6. #6
    Guest

    Predefinito

    Secondo me conviene creare due tabelle: una per gli users dove ognuno ha un id e una tabella per i log nella quale viene inserito solo più l'id dell'utente (e i relativi log chiaramente)

  7. #7
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Ciao
    Per rispondere a Debug e mavericckweb

    Non devo sovrascrivere i record
    in quanto ho intenzione anche di creare un collegamento
    per ogni user che mostri gli ultimi 15/20 accessi
    A proposito mi sfugge adesso come si fa a fare un controllo
    sull'user che esiste già e a sovrascriverlo con i nuovi dati
    (chissà potrei anche ripiegare su questo metodo :-)).

    Comunque, con l'aiuto anche di altri amici in rete
    ho abbozzato questo

    il codice che rileva i dati e li carica nel db (in una pagina che usa le sessioni)
    è questo:

    utenti.php:
    Codice:
    ....
    $whattime=time();   // restituisce la data
    $id_user = $_SESSION['verified_user'];
    $nome =  $datiutente['username'];
    $ip = $_SERVER['REMOTE_ADDR'];                 //restituisce l'ip dell'utente
    
    $dati=" INSERT INTO visite VALUES (NULL,
    '$id_user',
    '$nome',
    '$ip',
    $whattime)";                               
    mysql_query ($dati);
    ...
    la pagina che li estrae e visualizza è questa:

    Codice:
    ....
    $query = "SELECT id_visite,id_user, username, IP, MAX(visit)as 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_visite]
          </TD>
          <TD>
             $result[id_user]
          </TD>
          <TD>
             $result[username]
          </TD>
          <TD>
             $result[IP]
          </TD>
          <TD>$visita</TD></TR><br>";
    }
    ...
    mi mi hanno avvisato che la query potrebbe dare non proprio i
    risultati voluti.
    Quindi mi interesserebbe anche la soluzione di cui avete parlato.
    grazie

  8. #8
    Guest

    Predefinito

    comunque quel codice con il MAX(visit) ti restituisce sempre e solo il record più recente...

    per sovrascrivere i record con dati più recenti

    Codice:
    mysql_query("UPDATE visite SET visit='".$whattime."' WHERE id_user='".$id_user."'");
    mavericck

  9. #9
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Non ho letto tutto, comunque dal poco che ho capito devi trovare il penultimo valore inserito con utente X

    Devi fare una query annidata, qualcosa del tipo:
    SELECT primo, secondo,MAX(data) FROM visite WHERE ID_utente not IN (SELECT ID_utente FROM visite WHERE data = max(DATA))

    Oppure potrebbe funzionare anche una
    SELECT 1 * FROM visite WHERE DATA < MAX(data) ORDER ORDERBY DATA
    Ma penso che ti darebbe errore.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •