Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274

    MySQL: ricerca duplicati

    Salve, ho una tabella fatta in questo modo:

    uid (int), date (DATE), addr (varchar).

    uid contiene l'ID dell'utente, date una data, addr l'IP dell'utente.

    $mysql->query("SELECT uid, date, addr, users.username, users.email FROM `seen` LEFT JOIN `users` ON users.id = seen.uid GROUP BY `addr` HAVING COUNT(`addr`) > 1");

    con questa query riesco a beccare i cloni... sono che mi restituisce "UN solo record per clone", quando io invece voglio vedere tutti gli utenti che hanno lo stesso IP nella stessa data.

    Qualcuno mi sa aiutare riducendo il tutto in una sola query? Usando due query sarebbero log_2(n) confronti, con n molto grande perderei efficienza :master:
    Progeny

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274
    up
    Progeny

  3. #3

    Re: MySQL: ricerca duplicati

    Originariamente inviato da Progeny
    Salve, ho una tabella fatta in questo modo:

    uid (int), date (DATE), addr (varchar).

    uid contiene l'ID dell'utente, date una data, addr l'IP dell'utente.

    $mysql->query("SELECT uid, date, addr, users.username, users.email FROM `seen` LEFT JOIN `users` ON users.id = seen.uid GROUP BY `addr` HAVING COUNT(`addr`) > 1");

    con questa query riesco a beccare i cloni... sono che mi restituisce "UN solo record per clone", quando io invece voglio vedere tutti gli utenti che hanno lo stesso IP nella stessa data.

    Qualcuno mi sa aiutare riducendo il tutto in una sola query? Usando due query sarebbero log_2(n) confronti, con n molto grande perderei efficienza :master:
    se hai mysql >= 4.1 puoi fare una subquery, selezionando tutti gli UID dove risulta contato piu' di una volta lo stesso addr.

    codice:
    SELECT uid, date, addr, users.username, users.email 
    FROM `seen` 
    LEFT JOIN `users` ON users.id = seen.uid 
    WHERE uid = any (
         SELECT s.uid 
         from seen s
         GROUP BY `addr`
         HAVING COUNT(*) > 1  )
    ORDER BY users.username
    dovrebbe funzionare....

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

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274
    il problema rimane... mi conta solo un utente per ogni clone che becca...
    tipo se ci sono 2 cloni, quindi 2 uid che anno lo stesso addr, la query me ne ritorna solo 1
    Progeny

  5. #5
    Originariamente inviato da Progeny
    il problema rimane... mi conta solo un utente per ogni clone che becca...
    tipo se ci sono 2 cloni, quindi 2 uid che anno lo stesso addr, la query me ne ritorna solo 1
    prova con un altro raggruppamento....

    la via e' quella ... la uso per delle mie query e va bene, non ho studiato la struttura della tua tabella, questo lo devi fare tu.

    Se ho capito tu hai uid diversi, diverso username e stesso ip-address mentre dovrebbero essere univoci questi dati, e allora mi chiedo perche' fai due tabelle?

    Posta la query per vedere come l'hai interpretata.

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274
    faccio due tabelle perchè sono dati "diversi", nella tabella users ci sono le info degli utenti, id, email, password, username etc... nella tabella seen che ho aggiunto pochi mesi fa, ci sono i dati relativi all'ultima visita da parte dell'utente sul sito.

    Codice PHP:
    SELECT uiddateaddr FROM `seenWHERE uid ANY (SELECT uid FROM `seenGROUP BY `addrHAVING COUNT(`addr`) > 1
    stavo provando la query giusto per vedere cosa ritorava mysql... qui per il momento me ne sono fregato di sapere l'username, ho letto la documentazione di any...

    pare molto strano anche a me che non funzioni
    Progeny

  7. #7
    Se fai la subquery per conto suo, cosa ti rende?

    codice:
    SELECT uid 
    FROM `seen` 
    GROUP BY `addr` 
    HAVING COUNT(*) > 1

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274
    mi restituisce un uid per i record con addr uguali.
    Progeny

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2001
    Messaggi
    274
    $mysql->query("SELECT uid, date, addr, users.username, users.email
    FROM `seen`
    LEFT JOIN `users` ON users.id = seen.uid
    WHERE addr = ANY (
    SELECT s.addr
    FROM `seen` AS `s`
    GROUP BY `addr`
    HAVING COUNT(`addr`) > 1)
    ORDER BY users.username");

    ehm va bene così
    la caffeina evidentemente sta facendo i propri effetti
    Progeny

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.