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?
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
Hvordan vil du udvaelge record hvis der er flere hvor de felter er ens ?
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)
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"); } }
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
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.
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.
Computerworld tilbyder specialiserede kurser i database-management