Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:06 Der er 41 kommentarer og
1 løsning

DELETE duplicates from .. ka man det ?

Jeg har en tabel med 2973 poster i, men der skulle faktisk kun være 1/3 af dem ;o)

Hvordan kan jeg fjerne de overskydende 2/3 som er duplicates af den 3. del jeg GERNE vil beholde.

MySQL 3.22.32 er jeg desværre stuck med, så CREATE TEMPORARY table kan jeg ikke desværre ikke bruge :-(

Er rimeligt vigtigt og haster!
Avatar billede netsrac Praktikant
21. august 2001 - 23:09 #1
Kan du ikke bare lige skrive et hurtigt php script der klarer det ?

Løber tabellen igennem og tester i en ny midlertidig tabel som du opretter om recorden findes, hvis ikke indsættes den ?
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:11 #2
Jeg kan lave et SELECT med discting .. men der må være en nemmere måde end at sidde og skrive et script til det ...
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:16 #3
Kan du ikke lave en ny tabel og lave noget a\'la

insert into nytabel select distinct * from gammeltabel
Avatar billede netsrac Praktikant
21. august 2001 - 23:16 #4
Dovenskaben længe leve. Havde det været enhver anden database med respekt for sig selv havde jeg en løsning for det.
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:19 #5
netsrac> Som er....
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:20 #6
netsrac:> MySQL har skam respekt for sig selv .. men ikke noget under v3.23
Avatar billede netsrac Praktikant
21. august 2001 - 23:22 #7
tdaugaard >> Sagde ikke at mySQL ikke havde respekt for sig selv, sagde faktisk at de havde respekt for sig selv, det jeg mente var Access osv.

Henrik >> MS SQL og Oracle
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:23 #8
netsrac> Det var nu løsningen jeg efterlyste....
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:24 #9
tdaugaard> Har du prøvet mit forslag?
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:26 #10
henrik:> DISTINCT * kan jeg jo ikke bruge til noget .. det er kun \"username\" der IKKE må være ens ..
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:30 #11
Hvad så med

insert into nytabel select * from gammeltabel group by username;
Avatar billede netsrac Praktikant
21. august 2001 - 23:30 #12
Henrik >> Nåå noget i stil med:

CREATE TABLE nytabel AS (SELECT DISTINCT username FROM gammeltabel)

Noget i den stil kan klare opgaven i Oracle, kan ikke lige huske om det er den korrekte syntaxs.

tdaugaard >> Sorry vi spammer.
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:33 #13
Netsrac> Det er jo i princippet det samme jeg gør 23:16:20 og 23:30:22
Avatar billede netsrac Praktikant
21. august 2001 - 23:36 #14
Henrik >> Ja men kan man gøre det der ? Det ser meget mystisk ud.
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:41 #15
netsrac:> Kan MySQL også men først fra v3.23.xx .. og Azero nægter at opgradere deres v3.22 *GRR*
Avatar billede henrik_ffc Nybegynder
21. august 2001 - 23:42 #16
td> Det beklager jeg. Jeg testede ellers før jeg sendte (men med en 3.23.37).
Avatar billede netsrac Praktikant
21. august 2001 - 23:43 #17
tdaugaard >> Har de fået lavet det, det lyder da godt :-) Hvad med at hive det ned lokalt også gøre det ?
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:46 #18
henrik_ffc:> *sad selv med CREATE TEMPORARY TABLE .. SELECT ..* men nix .. står også i MySQL SQL reference som jeg sidder med ;o)

netsrac:> Yes yes ... hæ hæ .. jeg SIDDER med det lokalt .. eller dvs. i MySQL monitoren (DOS) connected til min MySQL DB (phpmyadmin siger mig ik noget ..)
Avatar billede netsrac Praktikant
21. august 2001 - 23:50 #19
Sidder med det lokalt som at data ligger på din lokale mysql server ? og mysql kan klare det fra version 3.23.xx som du jo selvfølgelig har installeret lokalt, hvad er så problemet ?
Avatar billede tdaugaard Nybegynder
21. august 2001 - 23:55 #20
netsrac:> *G* no no .. not THAT easy .. jeg bruger mysql monitor fra MIN mysql server til at connecte til A0\'s mysql server som er v3.22.32 .. sååe .. det er v3.22\'s funktioner der kan bruges :-(
Avatar billede mkelle1 Nybegynder
22. august 2001 - 02:05 #21
Hej Tdaugaard

Dette skulle kunne gøre det, hvis du tør:

$sql=\"select * from din_tabel group by username\";
$result=mysql_query($sql);
$sql_delete=\"delete from din_tabel\";
mysql_query($sql_delete);
while($row=mysql_fetch_row($result))
{
$sql_insert=\"insert into din_tabel (x,y,z.....) values (\'$row[0]\',\'$row[1]\',\'$row[2]\',......o.s.v.)\";
mysql_query($sql_insert);
}


Hilsen

Mads
Avatar billede tdaugaard Nybegynder
22. august 2001 - 10:53 #22
mkelle1:> Kan jeg selv lave en hel del smartere end det der .. desuden så sorterer det der intet fra og du sletter hele min tabel!
Avatar billede tdaugaard Nybegynder
22. august 2001 - 11:10 #23
Nå .. jeg bliver nok nød til at lave et script til det :o(
Avatar billede tdaugaard Nybegynder
22. august 2001 - 11:11 #24
svar :o)
Avatar billede nuno Nybegynder
22. august 2001 - 11:49 #25
tdaugaard> understøtter nærværende MySQL version såkaldte bulk copies? (SELECT * INTO FROM bla bla)

i så fald så kan du lave det således:

SELECT DISTINCT *
INTO DinDestTabel
FROM DinSrcTabel

/nuno
Avatar billede tdaugaard Nybegynder
22. august 2001 - 13:05 #26
nuno:> Det ved jeg faktisk ikke ... men det er da værd at undersøge da jeg endnu ikke er gået i gang med at lave et script til det.

Jeg prøver lidt senere ...
Avatar billede tdaugaard Nybegynder
22. august 2001 - 13:07 #27
nuno:> Men, DISTINCT * kan stadig ikke bruges da det kun er eet felt, username, der skal DISTINCT\'es på ... men det er jo nemt omgåeligt med DISTINCT(username),pcode,realname f.eks.. eller ?
Avatar billede nuno Nybegynder
22. august 2001 - 15:45 #28
Desværre er det ikke så ligetil...

DISTINCT er hæftet en hel record - ikke en enkelt kolonne. Når man sætter flere kolonner på et sådant udtræk forøges antallet af kolonner der skal være ens - for ikke at blive udelukket fra resultatet.

SELECT DISTINCT username, pcode, realname er syntaktisk helt ok - men så kræver det at både username, pcode og realname er ens, for at eventuelle dubletter udelukkes. Med andre ord vil alle records, hvori username fx er \"ib\" komme med i dette udtræk bare een af de andre kolonner i SELECT sætningen varierer fra værdierne i de andre records med username \"ib\".

Det lyder næsten som om et script vil være nemmere ;)


Avatar billede tdaugaard Nybegynder
22. august 2001 - 15:47 #29
nuno:> Men .. så vil jeg vel kunne lave:

SELECT DISTINCT(username) FROM users

I et loop hvor jeg henter records kan jeg lave endnu et select:

SELECT * FROM users WHERE username=\'$row[0]\'

og så indsætte data DERFRA i en ny tabel ?
Avatar billede tdaugaard Nybegynder
22. august 2001 - 15:51 #30
nuno:> Synes lige du fortjente 30 point for din hjælp her .. det var ikke lige den løsning jeg ville have, så derfor får du kun 30 istedet for 60. Er det okay med dig eller ?

http://www.eksperten.dk/spm/101192
Avatar billede henrik_ffc Nybegynder
22. august 2001 - 17:05 #31
Er følgende tilladt:

SELECT DISTINCT * INTO DinDestTabel FROM DinSrcTabel group by username

?
Avatar billede henrik_ffc Nybegynder
22. august 2001 - 17:06 #32
Hov!

Er følgende tilladt:

SELECT * INTO DinDestTabel FROM DinSrcTabel group by username

?
Avatar billede tdaugaard Nybegynder
22. august 2001 - 18:28 #33
henrik_ffc:> Det tror jeg ikke, men jeg ved det heller ikke.
Men desuden kan DISTINCT * heller ikke bruges.
Avatar billede nuno Nybegynder
22. august 2001 - 18:39 #34
henrik_ffc> tror det ikke - bulk copy er ret begrænset i \"fleksibilitet\" - den alm. syntaks er som SELECT *
INTO DinDestTabel
FROM DinSrcTabel

og bliver brugt til ganske enkelt at kopiere en tabel over i  en ny uden på forhånd at oprette den ny vha. CREATE TABLE - alt undtagen constraints bliver kopieret.


tdaugaard> jeg har siddet og rodet lidt med det her efter arbejde - og jeg kan sgu ikke gøre det med sql - jeg synes ikke at kunne \"vinde over\" den begrænsning, der ligger i at DISTINCT går på en hel record - og ikke på en kolonne. Jeg ved faktisk ikke om det kan løses vha. nogle vilde subqueries??

Problemet ved den anden SELECT du vil lave (den inde i loopet) det ligger vel i, at du får flere records i dit resultset med samme username - eftersom der vil være flere der matcher det username du har udtrukket vha. SELECT Distinct og nu sammenlinger med? Eller er jeg helt galt på den?
Avatar billede tdaugaard Nybegynder
22. august 2001 - 18:43 #35
nuno:> Ja, du har ret. Der vil hele tiden være 2 poster for meget, men da alle 3 er 100% ens (2 duplicates) så er det kun nødvendigt at hente værdierne for den første post.
Avatar billede nuno Nybegynder
23. august 2001 - 20:27 #36
hmm - jeg fandt en løsning i Access idag - men jeg ved ikke om du evt. kan overføre den til MySQL?

Først - så eksporterede jeg strukturen fra den tabel jeg havde data i - dvs. den originale tabel. Dernæst gik jeg ind og ændrede - så den kolonne der ikke måtte være duplicates i - i dit tilfælde username - blev sat til primary key. Dernæst kopierede jeg alt fra den gamle tabel til den nye - med det resultat at alt på nær duplicates blev kopieret - idet der jo ikke er tilladt duplicates i den nye primary key kolonne. Access genererer så en InsertErrors tabel (eller hvad det nu var den hed) med de records der ikke kunne kopieres. Derefter ændrede jeg tilbage igen, så username kolonnen ikke længere var primary key.

MEN: Humlen af det hele er, at jeg har en tabel, som er mage til den første - der er bare ikke nogen duplicates i :) - og det hele tog ca. 1 minut.

/nuno
Avatar billede tdaugaard Nybegynder
23. august 2001 - 20:33 #37
nuno:> Se det kan jeg desværre ikke gøre i MySQL da jeg intet \"Data view\" har på samme måde som i Access\' interface.
Avatar billede tdaugaard Nybegynder
23. august 2001 - 20:34 #38
Eller måske jo .. mySQL vil bare komme med en fejl jo ...
Avatar billede nuno Nybegynder
23. august 2001 - 20:52 #39
well - jeg kender ikke så meget til MySQL i praksis og derfor heller ikke de administrative interfaces til den. Access kommer såmænd også med fejl men genererer som nævnt en tabel med insert errors.

Hvad sker der hvis du forsøger at \"violate\" en primary key? Genererer den fejl på hele SQL sætningen - eller kun de records hvor username er det samme som et der allerede eksisterer?
Avatar billede tdaugaard Nybegynder
23. august 2001 - 20:58 #40
MIN mySQL administration foregår i DOS via SQL kald .. det HELE ;o)

Well .. jeg bruger et UNIQUE index istedet for primary key da jeg har et ID felt som pri. key *S*
MySQL er langt mere avanceret end Access sååe .. men den giver fejl på hele sætningen ja ..
Avatar billede nuno Nybegynder
24. august 2001 - 10:25 #41
ja - det er lidt paradoksalt at man kan bruge et \"low-level\" værktøj til noget praktisk. *sigh*

- har faktisk kun Access installeret i øjeblikket fordi jeg skal importere nogle produktdata for et website jeg er adm. på. - så det var en af de klassiske desperate \"last way out\" forsøg på at komme løse det. Well det lykkedes jo også - men kun i Access :(

Sorry det ikke gik.

*out*

/nuno
Avatar billede tdaugaard Nybegynder
24. august 2001 - 13:26 #42
nuno:> hæ hæ .. i disse \"Win32\" dage, ja *G*
Well, jeg skal nok få det løst ... jeg har fået Azero til at sende mig de fysiske database filer .. så smider jeg dem ind på min egen mySQL server .. så kan jeg lege lige så tosset jeg vil *G*
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