Avatar billede groyk Novice
07. juli 2009 - 16:07 Der er 6 kommentarer og
1 løsning

fjerne dubletter

Hej eksperter

Hvordan fjerner jeg hurtigt dubletter fra en tabel?

Har prøvet følgende
"CREATE TABLE ny_tabel SELECT DISTINCT * FROM gammel_tabel"

Det virker også fint. Nu vil jeg dog gerne nøjes med at sammenligne 2 eller 3 felter. Hvordan gøres dette?
Avatar billede arne_v Ekspert
07. juli 2009 - 16:16 #1
Hvordan vil du udvaelge record hvis der er flere hvor de felter er ens ?
Avatar billede groyk Novice
07. juli 2009 - 20:07 #2
Hej arne

Det er lige gyldigt, det er en søgning af nogle adresser i vores leverandør / kundesystem. Jeg vil gerne undgå at hente to rækker fra databasen såfremt vej, postnr er ens. Hvis der er flere rækker hvor disse felter er ens, skal den/de sidste bare slettes!

Jeg kan selvfølgelig loope alle rækker igennem og slette dem der er flere af i php, men der må findes en nemmere / hurtigere løsning med ren sql.

Hmm. faldt lige over denne, prøver jeg lige imorgen

ALTER IGNORE TABLE kunder ADD UNIQUE INDEX(vej,postnr)
Avatar billede groyk Novice
08. juli 2009 - 08:47 #3
Har lavet koden i php da jeg ikke har fundet en god løsning med ren SQL endnu.

Her er funktionen

function db_remove_dublets($table,$columns)
    {
        $order = explode(":",$columns);
          $result= db_query("SELECT * FROM ".my_addslashes($table)." ORDER BY ".$order[0]."");
        while($row = db_fetch_array($result)) {
            unset($filter);
            $column = explode(":",$columns);
                foreach($column as $c) {
                $filter .= "AND $c='$row[$c]' ";
            }
                #echo substr($filter,4) . "<br>";
            $query1="SELECT * FROM ".my_addslashes($table)." WHERE ".substr($filter,4)."";
            $result1=db_query($query1);
            $count = db_num_rows($result1) - 1;

            db_query("DELETE FROM ".my_addslashes($table)." WHERE ".substr($filter,4)." LIMIT $count");
        }
    }
Avatar billede groyk Novice
08. juli 2009 - 08:49 #4
Funktionen bruges således

// Removes dublets from db:
db_remove_dublets("MyTable","name:phone")

BEMÆRK: my_addslashes er en separat funktion

Og alle db_ funktioner skal ændres til mysql_ hvis under normale omstændigheder
Avatar billede arne_v Ekspert
20. juli 2009 - 04:39 #5
MySQL har en grim funktion som måske kan bruges:

CREATE TABLE ny_tabel SELECT DISTINCT f1,f2,f3,f4,f5,f6 FROM gammel_tabel GROUP BY f1,f2,f3

Bør tage distincte værdier af f1,f2,f3 og tage en tilfældig række for f4,f5,f6.

Generelt kan det ikke anbefales at lave noget tilfældigt med database data.

En alternativ løsning:

CREATE TABLE ny_tabel SELECT DISTINCT * FROM gammel_tabel

DELETE FROM ny_tabel t1 WHERE EXISTS (SELECT * FROM ny_tabel t2 WHERE t1.f1=t2.f1 AND t1.f2=t2.f2 AND t1.f3=t2.f3 AND t1.id < t2.id)

hvor id er et id felt hvor vi vælger det mindste.
Avatar billede groyk Novice
20. juli 2009 - 20:15 #6
Prøver nok sidste forslag, det burde være hurtigere end min egen funktion.

Dog har jeg ingen problemer med hastigheden.

Takker for hjælpen, venligst smid et svar.
Avatar billede arne_v Ekspert
20. juli 2009 - 20:27 #7
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester