Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 23

Discussione: query difficile

  1. #11
    [supersaibal]Originariamente inviato da lucas726
    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 [/supersaibal]
    Come ti pare.... ma non e' corretto perche' e' ingannevole. Il perche' gia l'ho spiegato prima. Ripeto perche' oggi e' il primo maggio...

    MAX(id_visite)as id_visite = estrae il valore max di id_visite

    id_user = il primo che trova

    IP = quello associato al primo record id_user che trova.

    MAX(visit) = il valore piu' alto di visit.

    In altre parole i due max() sono colonne per i fatti loro. Sono corretti nel loro contenuto, MA NON SONO vincolanti per i dati di GROUP BY. L'IP che dovrebbe essere il dato che interessa NON e' quello dei due MAX(), ma quello che si trova associato al primo id_user. Attenzione che il primo non significa il primo inserito, ma il primo nell'ordine di scorrimento della tabella.

    Quindi "casualmente" potrebbe anche essere quello giusto. Ma lo script e' buggato perche' non e' sistematico nella ricerca.

    Se vuoi provare non e' necessario di essere onl, basta che popoli tu la tabella con dati eterogenei di IP e data e confrontare poi il risultato della query e vedere se risponde "sempre" alle tue aspettative.



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

  2. #12
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    Si giusto! Ho provato in locale.
    Comunque sembra che il metodo (anche se forse non
    corretto) sembra reggere, nel senso che non
    mi ha riportato mai un risultato sbagliato
    Correspondevano sempre id_user, username, IP (da me modificato manualmente) e visit.
    Può essere sempre e soltanto una caso?

    Beh, se avete da suggerire comunque una query o un metodo
    migliore io sono qua.
    Ciao e grazie

  3. #13
    L'unico dato che potrebbe non essere corretto e' l'IP. Gli altri sono scelti in modo specifico e quindi corretti. E sara' pure il dato meno verificabile se dinamico.

    Se ti va bene ok... ma non mi fiderei ciecamente di ricevere sempre l'ultimo IP utilizzato dallo user.


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

  4. #14
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    [supersaibal]Originariamente inviato da piero.mac
    L'unico dato che potrebbe non essere corretto e' l'IP. Gli altri sono scelti in modo specifico e quindi corretti. E sara' pure il dato meno verificabile se dinamico.

    Se ti va bene ok... ma non mi fiderei ciecamente di ricevere sempre l'ultimo IP utilizzato dallo user.

    [/supersaibal]
    Ti ringrazio
    ma tu cosa suggerisci allora.
    Non è che mi sono interstardito con il codice sopra.
    Va bene tutto per me basta che funzioni e bene.
    Ciao

  5. #15
    prova la query con HAVING postata sopra. cambia l'IP di ogni record. E vedi che la query restituisca "sempre" l'IP che si trova per ultimo, oppure l'IP che secondo te vorresti vedere.

    Quindi modificando a mano l'IP e avendoli percio' tutti diversi, sarai sicuro che quello che viene estratto e' proprio quello atteso. Prova varie forme di selezione e ti renderai conto del risultato.


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

  6. #16
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    [supersaibal]Originariamente inviato da piero.mac
    prova la query con HAVING postata sopra. cambia l'IP di ogni record. E vedi che la query restituisca "sempre" l'IP che si trova per ultimo, oppure l'IP che secondo te vorresti vedere.

    Quindi modificando a mano l'IP e avendoli percio' tutti diversi, sarai sicuro che quello che viene estratto e' proprio quello atteso. Prova varie forme di selezione e ti renderai conto del risultato.

    [/supersaibal]
    La query con HAVING mi dava errore.
    Ho cambiato l'IP di ogni record e il metodo che usavo come ho detto non mi ha dato mai errore (fino ad ora) comunque riprovo con HAVING magari mi sfugge qualcosa, Grazie.

    Adesso avrei però un altro problema.

    La query sotto inserita nella pagina degli utenti
    carica i dati nel db:

    codice:
    ...
    $dati=" INSERT INTO visite VALUES (NULL,
    '$id_user',
    '$nome',
    '$ip',
    $whattime)";                              
    mysql_query ($dati);
    ...
    ciao
    Ho pensato di evitare di appesantire il db eccessivamente
    e vorrei realizzare un'altra query (posta prima o dopo quella di
    cui sopra) che controlli quanti record ci sono per ogni utente
    e se superano un tot da me scelto ne cancelli il più vecchio
    in ordine di data (riferito ovviamente allo stesso utente).
    Come potrei impostare la cosa?
    grazie anticipatamente

  7. #17
    [supersaibal]Originariamente inviato da lucas726
    La query con HAVING mi dava errore.
    Ho cambiato l'IP di ogni record e il metodo che usavo come ho detto non mi ha dato mai errore (fino ad ora) comunque riprovo con HAVING magari mi sfugge qualcosa, Grazie.

    Adesso avrei però un altro problema.

    La query sotto inserita nella pagina degli utenti
    carica i dati nel db:

    codice:
    ...
    $dati=" INSERT INTO visite VALUES (NULL,
    '$id_user',
    '$nome',
    '$ip',
    $whattime)";                              
    mysql_query ($dati);
    ...
    ciao
    Ho pensato di evitare di appesantire il db eccessivamente
    e vorrei realizzare un'altra query (posta prima o dopo quella di
    cui sopra) che controlli quanti record ci sono per ogni utente
    e se superano un tot da me scelto ne cancelli il più vecchio
    in ordine di data (riferito ovviamente allo stesso utente).
    Come potrei impostare la cosa?
    grazie anticipatamente [/supersaibal]
    Potresti fare
    SELECT COUNT(*) as tot ... where utente = $utente...

    poi una if che controlla se tot => valore_x
    se si, e se lo fai di fisso i max potrebbe essere 1 in piu', esegui:

    DELETE FROM TABELLA
    WHERE utente = $utente
    order by data asc
    limit 1

    e ti cancella quello con la data piu' vecchia.


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

  8. #18
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    ho modificato la query con having che mi avevi suggerito così:
    $query = "SELECT id_visite ,id_user, username, IP, MAX(visit) AS visit FROM visite GROUP BY id_user HAVING visit = MAX(visit) ORDER BY username";

    praticamente con As visit funziona
    con As last no.

    Sembra funzionare anche questa soluzione!
    Che dici adesso posso stare tranquillo sui risultati della query?
    poi in merito al delete:





    [supersaibal]Originariamente inviato da piero.mac
    Potresti fare
    SELECT COUNT(*) as tot ... where utente = $utente...
    ...
    scusa l'ignoranza su questa parte avrei bisogno
    di chiarimenti select count(*) non lo conosco




    grazie ancora per la pazienza
    ciao

  9. #19
    La clausola HAVING e' una estensione del WHERE con cui si posiziona in AND. La differenza e' che HAVING accetta i raggruppamenti mentre WHERE no per il semplice fatto che WHERE viene risolto "PRIMA" della risoluzione dei campi, mantre HAVING dopo.

    La formula corretta per avere sicuramente l'ultimo e' proprio mettere il campo risolto da MAX() come condizione in HAVING.

    quindi:
    codice:
    SELECT id_visite ,id_user, username, IP, 
    MAX(visit) AS visit 
    FROM visite 
    GROUP BY id_user 
    HAVING visit = MAX(visit) 
    ORDER BY username
    pero' sinceramente eviterei di utilizzare l'alias identico al campo. Proprio da questo derivano i dubbi espressi in precedenza... Hai la certezza che controlli l'alias e non il campo reale????

    Allora molto semplicemente cambia il nome e dormi sonni tranquilli...
    codice:
    SELECT id_visite ,id_user, username, IP, 
    MAX(visit) AS max_visit 
    FROM visite 
    GROUP BY id_user 
    HAVING max_visit = MAX(visit) 
    ORDER BY username
    SELECT COUNT(*) con la clausola where ti conta il numero dei campi che rispondono alla richiesta. Rende sempre un campo, con zero o con il numero dei record trovati.(prendilo con mysql_fetch_num oppure metti un alias).
    Sapendo quanti possono essere come numero massimo, con la if scegli se cancellare o meno il record eccedente.


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

  10. #20
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    [supersaibal]Originariamente inviato da piero.mac
    La clausola HAVING e' una estensione del WHERE con cui si posiziona in AND. La differenza e' che HAVING accetta i raggruppamenti mentre WHERE no per il semplice fatto che WHERE viene risolto "PRIMA" della risoluzione dei campi, mantre HAVING dopo.

    La formula corretta per avere sicuramente l'ultimo e' proprio mettere il campo risolto da MAX() come condizione in HAVING.

    quindi:
    codice:
    SELECT id_visite ,id_user, username, IP, 
    MAX(visit) AS visit 
    FROM visite 
    GROUP BY id_user 
    HAVING visit = MAX(visit) 
    ORDER BY username
    pero' sinceramente eviterei di utilizzare l'alias identico al campo. Proprio da questo derivano i dubbi espressi in precedenza... Hai la certezza che controlli l'alias e non il campo reale????

    Allora molto semplicemente cambia il nome e dormi sonni tranquilli...
    codice:
    SELECT id_visite ,id_user, username, IP, 
    MAX(visit) AS max_visit 
    FROM visite 
    GROUP BY id_user 
    HAVING max_visit = MAX(visit) 
    ORDER BY username
    SELECT COUNT(*) con la clausola where ti conta il numero dei campi che rispondono alla richiesta. Rende sempre un campo, con zero o con il numero dei record trovati.(prendilo con mysql_fetch_num oppure metti un alias).
    Sapendo quanti possono essere come numero massimo, con la if scegli se cancellare o meno il record eccedente.

    [/supersaibal]

    Si penso di aver risolto tutto (forse mi perdevo in un bicchiere d'acqua)
    La soluzione che ho cercato di scrivere con count mi dava dei problemi, sicuramenti dovuti alla mia scarsa conoscenza del php e del mysql comunque.
    Ho fatto così (nella pagina utenti.php):
    codice:
    ...
    $tuttosingolo = "SELECT * FROM visite where id_user= '$id_user'";
    $query=mysql_query ($tuttosingolo);
    $righe = mysql_num_rows ($query);
    echo "
    
    ".$righe;
    if($righe>5){
    $canc="DELETE FROM visite where id_user= '$id_user' order by visit asc limit 1";
    mysql_query ($canc);
    }
    ...
    Sembra funzionare bene e se non hai niente da aggiungere direi di concludere la discussione qui.
    Grazie supersaibal sei stato preziosissiomo!!
    Alla prossima

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 © 2026 vBulletin Solutions, Inc. All rights reserved.