Avatar billede nemlig Professor
09. oktober 2012 - 21:12 Der er 22 kommentarer og
1 løsning

Fjerne flere forekomster med samme værdier

Hejsa.
Jeg har en database med kundeoplysninger, og af forskellige årsager, fremgår nogle af posterne gentagne gange - nogle op til 5-6 gange.

Findes der en enkelt metode til at slette alle "gengangere".

Altså, hvis felterne "navn", "adresse" og "postnr" fremgår i flere poster med samme værdier, så ønskes kun én post bevaret med samme værdi.
Avatar billede arne_v Ekspert
09. oktober 2012 - 21:19 #1
Hvilket kriteria skal bruges for at udvaelge hvilke der skal slettes og hvilke der ikke skal slettes?
Avatar billede nemlig Professor
09. oktober 2012 - 21:21 #2
På alle poster, er der også registeret en "datetime".
Nyeste post, skal bevares.
Avatar billede arne_v Ekspert
09. oktober 2012 - 23:06 #3
SELECT *
FROM tabel t1
WHERE EXISTS (SELECT * FROM tabel t2 WHERE t2.name=t1.name AND t2.adresse=t1.adresse AND t2.postnr=t1.postnr AND t2.tidsstempel > t1.tidsstempel)

og hvis du kan lide output saa erstat SELECT * med DELETE
Avatar billede nemlig Professor
10. oktober 2012 - 07:13 #4
Sejt Arne :).
Bare lige for fuldstændighedens skyld.....
SELECT * står 2 gange. Er dette begge, jeg erstatter med DELETE, når jeg har sikret at output med SELECT * er OK?

Smid bare et svar.
Avatar billede arne_v Ekspert
10. oktober 2012 - 15:24 #5
Kun det foerste.
Avatar billede arne_v Ekspert
10. oktober 2012 - 15:24 #6
svar
Avatar billede nemlig Professor
10. oktober 2012 - 21:11 #7
Hmmm - det driller mig.
Jeg har lavet denne kode:

$sql = "SELECT *
FROM kundeliste t1
WHERE EXISTS (SELECT * FROM kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND
t2.adresse1=t1.adresse1 AND
t2.date_indtastet > t1.date_indtastet)";

Output = 0 poster

Hvis jeg fjerner sidste kriterie med feltet "date_indtastet", så hentes derimod samtlige poster i databasen.
Avatar billede arne_v Ekspert
10. oktober 2012 - 21:45 #8
Er du sikker paa at du har duplikater med den definition?
Avatar billede nemlig Professor
10. oktober 2012 - 22:14 #9
Sorry - feltet med date_indtastet havde samme værdi i alle poster. Nu har jeg rettet det, og så ser det ud til at virke.

Må jeg lige spørge til en sidste detalje:

Jeg ønsker ikke, at poster med værdien "0000-00-00 00:00:00" i feltet "opretDato" medtages i SELECTEN.

Har du en nem løsning på dette også?
Avatar billede arne_v Ekspert
10. oktober 2012 - 22:28 #10
$sql = "SELECT *
FROM kundeliste t1
WHERE EXISTS (SELECT * FROM kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND
t2.adresse1=t1.adresse1 AND
t2.date_indtastet > t1.date_indtastet AND
opretDato!=0)";

eller '0000-00-00 00:00:00' - jeg kan ikke huske synatxen for det
Avatar billede nemlig Professor
10. oktober 2012 - 22:33 #11
Tusinde tak for hjælpen.
Avatar billede nemlig Professor
10. oktober 2012 - 22:45 #12
Jeg er ked af, at skal forstyre dig igen.
Min SELECT fungerer fint, og jeg har så skiftet SELECT med DELETE, men får følgende fejl:

Databasefejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 ' at line 1

MySQL-sætningen var:
DELETE * FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00')
Avatar billede arne_v Ekspert
10. oktober 2012 - 22:50 #13
DELETE FROM

ikke

DELETE * FROM
Avatar billede nemlig Professor
10. oktober 2012 - 22:58 #14
Det giver samme fejl:

Databasefejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1' at line 1

MySQL-sætningen var:
DELETE FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00')
Avatar billede arne_v Ekspert
11. oktober 2012 - 00:55 #15
har du et id felt som primaer noegle?
Avatar billede nemlig Professor
11. oktober 2012 - 01:44 #16
Ja, det er feltet "id".
Avatar billede arne_v Ekspert
11. oktober 2012 - 01:52 #17
DELETE FROM kal02_kundeliste WHERE id IN
(SELECT id FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00') )

maaske
Avatar billede nemlig Professor
11. oktober 2012 - 07:16 #18
Ikke helt:

Databasefejl:
You can't specify target table 'kal02_kundeliste' for update in FROM clause

MySQL-sætningen var:
DELETE FROM kal02_kundeliste WHERE id IN (SELECT id FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00') )
Avatar billede nemlig Professor
11. oktober 2012 - 07:24 #19
Alternativt, så virker min SELECT jo fint, og så kan jeg vel bare køre en while......med den DELETE .. WHERE id=$row['id']...

eller smide id'erne i et array og køre en delete med id numrene fra arrayet.

Jeg foretrækker at klare det med en SQL, men det er ikke afgørende.
Avatar billede arne_v Ekspert
11. oktober 2012 - 15:32 #20
Argh.

OK.

CREATE TABLE del_ids (id INTEGER PRIMARY KEY);

INSERT INTO TABLE del_ids
SELECT id FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00')

DELETE FROM kal02_kundeliste WHERE id IN (SELECT id FROM del_ids);

DROP TABLE del_ids;
Avatar billede nemlig Professor
11. oktober 2012 - 18:48 #21
Hmm.
Oprettelse af den midlertidige tabel lykkedes, men at hente de valgte id'er over i den midlertidige tabel fejler:

Databasefejl:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE kal02_del_ids SELECT id FROM kal02_kundeliste t1 WHERE EXISTS (SELECT ' at line 1

MySQL-sætningen var:
INSERT INTO TABLE kal02_del_ids SELECT id FROM kal02_kundeliste t1 WHERE EXISTS (SELECT * FROM kal02_kundeliste t2 WHERE t2.organisation=t1.organisation AND t2.kontaktperson=t1.kontaktperson AND t2.aftaleOpretDato > t1.aftaleOpretDato AND aftaleOpretDato != '0000-00-00 00:00:00')
Avatar billede arne_v Ekspert
11. oktober 2012 - 18:55 #22
lille fejl

INSERT INTO TABLE kal02_del_ids

->

INSERT INTO kal02_del_ids
Avatar billede nemlig Professor
11. oktober 2012 - 19:43 #23
HURRA HURRA - Så faldt det helt på plads.
Tusinde tak endnu engang - ikke mindst får din vedholdenhed og tålmodighed.
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