Avatar billede killel Nybegynder
30. oktober 2008 - 17:26 Der er 19 kommentarer og
1 løsning

Oprydning af database (jeg vil kun have hver post en gang)

Hej,

Jeg har en database med 15-20 punkter.

Hver post bør være unik, men mit cronejob at kørt scripet lidt oftere end planlagt og har således tilføjet data til databasen 3 gange i døgnet i stedet for kun en gang.

Jeg har et felt til hver post som indeholder datoen.

Er det ikke muligt at lave en automatisk sletning af databasen så der kun fremkommer unikke poster (hvor jeg beholder den nyeste post)?

Databasen ligger ved one.com
Avatar billede fbhzone Nybegynder
30. oktober 2008 - 20:32 #1
Kan du ikke lave en søgning i phpmyadmin?
Avatar billede killel Nybegynder
30. oktober 2008 - 20:46 #2
Jo, det kan jeg sikkert, men hvordan?
Avatar billede Slettet bruger
30. oktober 2008 - 21:28 #3
phpMyAdmin er for database-arbejde -
du kan lige så godt lære det nu som senere.

du må vel vide hvordan din database ser ud, - ellers er det da svært at hjælpe dig.
Det er ikke mange oplysninger du kommer med.

Hvad har du egentlig selv gjort for at rette fejlen?
Avatar billede killel Nybegynder
30. oktober 2008 - 22:01 #4
Rettet cronejobbet så det kun kører en gang i døgnet.

Jeg ved 100% hvordan min database ser ud. Det jeg spørger om er hvordan jeg laver en søgning som returnerer alle poster som indeholder dubletter inde for det samme døgn hvorefter jeg så kan slette dem eller alternativt noget ala...

DELETE * FROM tabel1 WHERE "der findes dubletter".

Jeg har et felt som hedder added som indeholder TIMESTAMP (xxxx-xx-xx 00:00:00).

For hver ID er der et added felt og hvis der er to identiske ID'er inde for samme døgn skal de resterende findes og slettes så der kun forefindes en post for hver ID inde for samme døgn.

Jeg kan godt tælle hvormange punkter der er i databasen, men kunne ikke se relevansen i forhold til mit spørgsmål.

Databasen indeholder pt. ca. 1.000.000 poster.
Avatar billede Slettet bruger
30. oktober 2008 - 22:10 #5
Jamen det er jo meget nemt!

Du skal ind i phpmyadmin og lave/køre en SQL'er der rydder op.

*sikkerhedskopi* og atter *sikkerhedskopi*

Men for din egen skyld og sikkert en masse andre, øv dig først på en kopi så du er sikker på at oprydningen bliver korrekt.

Da du selv ved 100% hvordan din database ser ud er det også kun dig selv der kan lave den korrekt SQL'er.

mvh
Avatar billede killel Nybegynder
30. oktober 2008 - 22:21 #6
Hvis jeg vidste hvordan ville jeg ikke spørge.

Jeg kan stadig ikke se at tabellens opbygning har betydning udover jeg har oplyst at de styrende felter er ID og ADDED. Alt der imellem følger med om der så var 100 punkter hvis kan laver en SQL som udvælger *, eller er det mig der tager fejl der.

Jeg skal gerne oplyse tabellens opbygning hvis det har en betydning...

Ved du hvordan det kan gøres eller?
Avatar billede Slettet bruger
30. oktober 2008 - 22:47 #7
er det noget i denne retning du mener?
før:
id | a | b
1 | 1 | 2
2 | 1 | 2
3 | 2 | 3
5 | 3 | 4

efter:
id | a | b
2 | 1 | 2
3 | 2 | 3
5 | 3 | 4


http://www.cyberciti.biz/faq/howto-removing-eliminating-duplicates-from-a-mysql-table/#comment-37556
Avatar billede killel Nybegynder
30. oktober 2008 - 23:21 #8
nærmere:
id | a | added
1 | 1 | 2008-10-10 10:10:10
1 | 1 | 2008-10-10 10:12:00
2 | 1 | 2008-10-10 10:10:10
3 | 2 | 2008-10-10 10:10:10
4 | 3 | 2008-10-10 10:10:10

efter:
id | a | added
1 | 1 | 2008-10-10 10:12:00
2 | 1 | 2008-10-10 10:10:10
3 | 2 | 2008-10-10 10:10:10
4 | 3 | 2008-10-10 10:10:10
Avatar billede Slettet bruger
30. oktober 2008 - 23:32 #9
Nå sådan, id er altså unikt?
men a og added må godt indeholde identiske.

jeg har ikke den eksakte løsning på det, håber der er andre der sidder og "fintænker"

Nu dapper jeg i seng, godnat.
Avatar billede arne_v Ekspert
31. oktober 2008 - 03:08 #10
Hvis du har en nyere MySQL bør:

SELECT *
FROM tabel t1
WHERE NOT EXISTS (SELECT * FROM tabel t2 WHERE t1.id=t2.id AND t2.added > t1.added)

vil returnere de rækker du skal bruge og det kan du udnytte til at lave
en ny tabel med samme struktur og så lave en:

INSERT INTO nytabel SELECT ...
Avatar billede killel Nybegynder
31. oktober 2008 - 08:19 #11
Umiddelbart vil dit forslag tage * fra tabel 1 og sammenlige det med * fra tabel 2 hvor id'et i tabel 1 og 2 er ens og added i tabel 2 er større end i tabel 1.

Jeg har kun en tabel hvor det hele ligger i og jeg har samme id med mange forskellige datoer (problemet er der hvor jeg har samme id med samme dato).

id er ikke unikt i tabellen men unikt i forhold til datoen. Jeg bruger id'et til at se ændringer i dataen forhold til dagen før.
Avatar billede Slettet bruger
31. oktober 2008 - 11:50 #12
Hej igen
Uden at have en løsning på problemet vil jeg lige komme med nogle betragtninger.

Først drejer det vel sig om at få de rigtige rækker ud, tømme tabellen og lægge de rigtige ind.

Det kunne f.eks være noget der lignede dette: (DET ER TOTAL UTESTET)
INSERT INTO dinTabel (id, a, added) SELECT DISTINCT id, a, added FROM kopidinTabel

Men her er lige en ting der skal huskes på, det er TIMESTAMP.
Timestamp feltet skal ændres til DATETIME før de rigtige lægges ind og derefter ændres tilbage, fordi timestamperen den gør som den skal.
Avatar billede killel Nybegynder
31. oktober 2008 - 12:02 #13
Får jeg så ikke blot de unikke ID'er?

Jeg skal bruge de unikke ID'et sammenholdt med added feltet, altså er der gået 10 dage har jeg 10 ens id'er og 10 forskellige dage.

Problemet er bare at jeg pt. har måske 20 id'er og 10 datoer i en 10 dages periode, da added tages via timestamp og scriptet er kørt 2 dange i døgnet og nogle gange flere.
Avatar billede arne_v Ekspert
31. oktober 2008 - 12:04 #14
Prøv lige og kør min query !

Den returnerer alle rækker i tabellen hvor der ikke er en række i samme tabel
med samem ud og nyere tid.

Hvilket udfra din beskrivelse er hvad du skal bruge.

t1 og t2 er to aliaser for samme tabelnavn !
Avatar billede killel Nybegynder
31. oktober 2008 - 19:35 #15
Hvor mange timer bør/skal den køre før den er færdig?

1. time er tilsyneladende ikke nok.

Der er pt. 1.735.706 poster i tabellen
Avatar billede arne_v Ekspert
31. oktober 2008 - 19:40 #16
Hvis der ikke er index på id og added, så kan den tage meget lang tid.
Avatar billede killel Nybegynder
31. oktober 2008 - 19:49 #17
det er sgu ikke sikkert der er det ;(

det havde jeg ikke lige tænkt på.

Nå jeg lader den køre til den er færdig og vender tilbage med resultatet her
Avatar billede arne_v Ekspert
18. januar 2009 - 04:19 #18
og ??
Avatar billede killel Nybegynder
18. januar 2009 - 10:46 #19
Sorry, jeg havde helt glemt at vende tilbage ;(

Der var som du var inde på ingen index på id og added og den kører mere eller mindre i et døgn så vidt jeg husker.

Men det korte af det lange er, at jeg tilføjede index på de to hvorefter jeg kørte den igen og så tog det kun 5-10 min.

Så skriv svar og du skal få dine point.
Avatar billede arne_v Ekspert
18. januar 2009 - 15:47 #20
svar
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