/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL - Fjerne dubletter
Fra : Jimmy


Dato : 23-11-02 09:07

Hej

Jeg kan ikke lige overskue, om man kan fjerne dubletter fra en MySQL-tabel
med en enkelt streng.

Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
Samtidig skal kun dem, som er ældre end 1 uge fjernes.
Der er både dato og tidspunkt i mit Tidspunkt-felt.

Kan I hjælpe mig?

Mvh
Jimmy



 
 
Morten Guldager (23-11-2002)
Kommentar
Fra : Morten Guldager


Dato : 23-11-02 11:19

In article <OGGD9.10$OV.333@news.get2net.dk>, Jimmy wrote:
>
> Jeg kan ikke lige overskue, om man kan fjerne dubletter fra en MySQL-tabel
> med en enkelt streng.

Nogen gange kan man. MySQL mangler sub-selects, men tager gerne en
where clause på en delete.

> Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> Der er både dato og tidspunkt i mit Tidspunkt-felt.
>
> Kan I hjælpe mig?

Kan du lave en select der finder de rækker der skal slettes?

Eller det der skoen trykker?


/Morten

Jimmy (23-11-2002)
Kommentar
Fra : Jimmy


Dato : 23-11-02 12:23


"Morten Guldager" <spamtrap@mogul.dk> wrote in message
news:slrnatulg9.bd0.spamtrap@guldager.uni.to...
> In article <OGGD9.10$OV.333@news.get2net.dk>, Jimmy wrote:
> >
> > Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> > Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> > Der er både dato og tidspunkt i mit Tidspunkt-felt.
> >
> > Kan I hjælpe mig?
>
> Kan du lave en select der finder de rækker der skal slettes?
>
> Eller det der skoen trykker?

Nej det er nok her det halter.
Jeg kan ikke overskue, hvordan man skulle gøre - Det eneste jeg kunne finde
ud af ville være at løbe tabellen igennem, hente første række, hvorved jeg
har de parametre jeg har brug for og så slette de andre og så forfra igen.

Denne metode er så håbløs at der må være andre der har udviklet en bedre
metode!

Mvh
Jimmy
>
>
> /Morten



Jesper Brunholm (24-11-2002)
Kommentar
Fra : Jesper Brunholm


Dato : 24-11-02 16:31

Jimmy wrote:

> >>Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> >>Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> >>Der er både dato og tidspunkt i mit Tidspunkt-felt.


DELETE FROM MinTabelsNavn WHERE Kol2 = Kol3 AND KolDatoEllTimestamp <
20021117

Den er så for idag - jeg tror faktisk at du med NOW() og et lille inline
regnestykke kan automatisere det med "mere end en uge gammelt", men hvis
du kan få din php/asp/younameit til at give dig den limit-dato så er det
nok hurtigere, hovedregning er ikke mysqls force

Derudover så har w3schools.com, devshed.com og webcafe.dk nogle
udemærkede tutorials i basal sql

mvh

Jesper Brunholm


Jimmy (24-11-2002)
Kommentar
Fra : Jimmy


Dato : 24-11-02 16:51


"Jesper Brunholm" <nospam@brunholm-scharff.dk> wrote in message
news:3de0f0aa$1@news.wineasy.se...
> Jimmy wrote:
>
> > >>Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> > >>Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> > >>Der er både dato og tidspunkt i mit Tidspunkt-felt.
>
>
> DELETE FROM MinTabelsNavn WHERE Kol2 = Kol3 AND KolDatoEllTimestamp <
> 20021117

Jeg må have forklaret mig upræcist.

Kolonne 2 indeholder en brugers ID
Kolonne 3 indeholder en artikels ID

Den samme bruger kan have læst samme artikel mange gange.
Jeg ønsker kun, at en brugers ID og en given artikels ID forefindes een gang
i tabellen.

Jeg bruger også tabellen til andre ting og er derfor ikke interesseret i
løsninger som omhandler i hvilket tilfælde jeg INSERTer data i tabellen.
Jeg er heller ikke interesseret i at have to tabeller sov.

Jeg er udelukkende interesseret i at fjerne dubletter fra min eksisterende
tabel.

Det kunne som sagt gøres med DISTINCT og fjerne alle udntagen den ene, men
det er ineffektivt.

> Derudover så har w3schools.com, devshed.com og webcafe.dk nogle
> udemærkede tutorials i basal sql

Held og lykke med dem.

Mvh
Jimmy



Jesper Brunholm (24-11-2002)
Kommentar
Fra : Jesper Brunholm


Dato : 24-11-02 22:22

Jimmy wrote:

> >>>>Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> >>>>Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> >>>>Der er både dato og tidspunkt i mit Tidspunkt-felt.
> >
> >
> >DELETE FROM MinTabelsNavn WHERE Kol2 = Kol3 AND KolDatoEllTimestamp <
> >20021117
>
> Jeg må have forklaret mig upræcist.

Tjah - jeg havde i hvert fald ikke forstået hvad du skulle bruge -
beklager

> Kolonne 2 indeholder en brugers ID
> Kolonne 3 indeholder en artikels ID
>
> Den samme bruger kan have læst samme artikel mange gange.
> Jeg ønsker kun, at en brugers ID og en given artikels ID forefindes
> een gang
> i tabellen.


OK: 14. november i denne gruppe skrev Nis Jørgensen i et indlæg
(<http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=3dcd9a33%241%245756%24ba624c82%40nntp04.dk.telia.net&rnum=3&prev=/groups%3Fq%3Dmysql%2B%2522vise%2Bens%2Bposter%2522%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3D3dcd9a33%25241%25245756%2524ba624c82%2540nntp04.dk.telia.net%26rnum%3D3>)
at det er lidt besværligt med MySQL hvor man ikke kan bruge subselects,
men at flg skulle kunne gøre det:

SELECT m1.felt1, m1.felt2, ...
FROM mintabel AS m1 INNER JOIN mintabel AS m2 ON m1.email = m2.email
GROUP BY m1.felt1, m1.felt2, ..., m1.email
HAVING count(*)> 1

Jeg håber du kan bruge det(?)

> Jeg bruger også tabellen til andre ting og er derfor ikke interesseret i
> løsninger som omhandler i hvilket tilfælde jeg INSERTer data i tabellen.

så vil jeg undlade at foreslå at du blot undgår double entries til en
start

> >Derudover så har w3schools.com, devshed.com og webcafe.dk nogle
> >udemærkede tutorials i basal sql
>
> Held og lykke med dem.

Ja - endnu engang beklager jeg at jeg misforstod dit spørgsmål - og
skrev ovenstående efter at have læst svaret til Morten G.
Jeg vil dog lige rette mig selv ved samme lejlighed: det er ikke kun det
basale de når igennem på devshed.

mvh

Jesper Brunholm


Jimmy (25-11-2002)
Kommentar
Fra : Jimmy


Dato : 25-11-02 00:08


"Jesper Brunholm" <nospam@brunholm-scharff.dk> wrote in message
news:3de142f1@news.wineasy.se...
> Jimmy wrote:
>
> > Jeg må have forklaret mig upræcist.
>
> Tjah - jeg havde i hvert fald ikke forstået hvad du skulle bruge -
> beklager

Det er OK - Efter at have læst det et par gange kan jeg godt se det var helt
i skoven at håbe på nogen fattede det


> OK: 14. november i denne gruppe skrev Nis Jørgensen i et indlæg
>
(<http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=3dcd9a
33%241%245756%24ba624c82%40nntp04.dk.telia.net&rnum=3&prev=/groups%3Fq%3Dmys
ql%2B%2522vise%2Bens%2Bposter%2522%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF
-8%26selm%3D3dcd9a33%25241%25245756%2524ba624c82%2540nntp04.dk.telia.net%26r
num%3D3>)
> at det er lidt besværligt med MySQL hvor man ikke kan bruge subselects,
> men at flg skulle kunne gøre det:

Vildt nok du fik den med uden den knækkede!

> SELECT m1.felt1, m1.felt2, ...
> FROM mintabel AS m1 INNER JOIN mintabel AS m2 ON m1.email = m2.email
> GROUP BY m1.felt1, m1.felt2, ..., m1.email
> HAVING count(*)> 1
>
> Jeg håber du kan bruge det(?)


Der er 28.000 rækker i den jeg laver operationer på nu og den bliver jo ikke
mindre.
Den tygger på SQL'en i 3 minutter hvorefter IE siger, at siden ikke kan
vises.

Har jeg anvendt SQL'en korrekt:

SELECT m1.Profil_ID, m1.Artikel_ID
FROM line_last_read AS m1 INNER JOIN line_last_read AS m2 ON m1.Profil_ID =
m2.Profil_ID
GROUP BY m1.Profil_ID, m1.Artikel_ID
HAVING count(*)> 1
LIMIT 0,30



> > >Derudover så har w3schools.com, devshed.com og webcafe.dk nogle
> > >udemærkede tutorials i basal sql
> >
> > Held og lykke med dem.
>
> Ja - endnu engang beklager jeg at jeg misforstod dit spørgsmål - og
> skrev ovenstående efter at have læst svaret til Morten G.
> Jeg vil dog lige rette mig selv ved samme lejlighed: det er ikke kun det
> basale de når igennem på devshed.

Fino - Ofte har man et behov for at få løst et givent problem her og nu.
Endnu oftere sker det at folk på News har behov for at pille andre ned ved
at henvise til begynderartikler osv, da de så kan føle sig klogere end den
de sender artiklen til.

Jeg siger ikke det var tilfældet her, da jeg jo havde forklaret mig
misvisende.

Jeg slipper i øvrigt nok ikke for to tabeller.
Det er bare irriterende, at have to tabeller der er stort set ens...

Takker,
Jimmy



Jesper Brunholm (25-11-2002)
Kommentar
Fra : Jesper Brunholm


Dato : 25-11-02 09:52

Jimmy wrote:
> "Jesper Brunholm" <nospam@brunholm-scharff.dk> wrote in message
> news:3de142f1@news.wineasy.se...

>>OK: 14. november i denne gruppe skrev Nis Jørgensen i et indlæg

> (<http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=3dcd9a
> 33%241%245756%24ba624c82%40nntp04.dk.telia.net&rnum=3&prev=/groups%3Fq%3Dmys
> ql%2B%2522vise%2Bens%2Bposter%2522%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF
> -8%26selm%3D3dcd9a33%25241%25245756%2524ba624c82%2540nntp04.dk.telia.net%26r
> num%3D3>)
>
> Vildt nok du fik den med uden den knækkede!

(kodeordet er krokodillenæb

> Der er 28.000 rækker i den jeg laver operationer på nu og den bliver jo ikke
> mindre.
> Den tygger på SQL'en i 3 minutter hvorefter IE siger, at siden ikke kan
> vises.

Hmm - umiddelbart ville jeg nok prøve at lave en mindre tabel og teste
på - så det har jeg gjort. Så kunne jeg selv prøve at se resultatet lidt
an. Der er en grund til at jeg omhyggeligt quotede Nis for at have
postet koden - _jeg_ har ikke udtænkt den

> Har jeg anvendt SQL'en korrekt:
>
> SELECT m1.Profil_ID, m1.Artikel_ID
> FROM line_last_read AS m1 INNER JOIN line_last_read AS m2 ON m1.Profil_ID =
> m2.Profil_ID
> GROUP BY m1.Profil_ID, m1.Artikel_ID
> HAVING count(*)> 1
> LIMIT 0,30

Jeg prøvede med:

SELECT m1.ID, m1.Profil_ID, m1.Artikel_ID
FROM line_last_read AS m1 INNER JOIN line_last_read AS m2 ON m1.Profil_ID =
m2.Profil_ID
GROUP BY m1.Profil_ID, m1.Artikel_ID
HAVING count(*)> 1
LIMIT 0,30

hvor tabellen line_last_read ser sådan ud:

ID Profil_ID Artikel_ID Timestamp
Ret Slet 0 1 2 20021125092341
Ret Slet 1 1 2 20021125092348
Ret Slet 2 1 2 20021125092353
Ret Slet 3 1 2 20021125092414
Ret Slet 4 3 4 20021125092420
Ret Slet 5 3 4 20021125092427
Ret Slet 6 1 5 20021125092432
Ret Slet 7 1 6 20021125092436


Resultatet blev:
ID Profil_ID Artikel_ID
Ret Slet 0 1 2
Ret Slet 6 1 5
Ret Slet 7 1 6
Ret Slet 4 3 4

Dvs: den har nydeligt sorteret de poster ud som ikke skal slettes...

Det ville jeg kunne bruge til en php-løkke, men jeg kan ikke gennemskue
hvordan det kan bruges direkte i mysql.

Næste problem er størrelsen - det må vel optimere hvis vi kan begrænse
til relevante poster (dvs over en uge gamle)?

Alternativt (som nok også er svaret på hvordan det kan bruges) kan man
lave en temporary tabel i SQL

(og jeg må endnu engang ty til en andens post, dennegang Jakob Bock -
Newsgroups: dk.edb.internet.webdesign.serverside.php
Subject: Re: [MySQL] vise ens poster
Date: Sun, 10 Nov 2002 18:21:00 +0100)

CREATE TEMPORARY TABLE tmp ( id SMALLINT UNSIGNED NOT NULL UNIQUE ) TYPE =
HEAP;

INSERT INTO tmp SELECT id FROM x GROUP BY value HAVING COUNT(value) > 1;

SELECT x.* FROM tmp, x WHERE tmp.id = x.id ORDER BY value;

> Jeg slipper i øvrigt nok ikke for to tabeller.
> Det er bare irriterende, at have to tabeller der er stort set ens...

jeps!

mvh

Jesper Brunholm

--
H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>


Jens Gyldenkærne Cla~ (25-11-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 25-11-02 10:42

Jesper Brunholm skrev:

>> Vildt nok du fik den med uden den knækkede!
>
> (kodeordet er krokodillenæb

....kombineret med et usenetprogram der bruger dem til noget.
Metoden til at sende lange URI'er uden de knækker er ret forskellig
fra program til program.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jakob Andersen (24-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 24-11-02 23:48

"Jimmy" <spoerg@efter.den> wrote
> Jeg kan ikke lige overskue, om man kan fjerne dubletter fra en MySQL-tabel
> med en enkelt streng.
>
> Jeg har brug for at fjerne alle de poster, hvor kolonne 2 og 3 er ens.
> Samtidig skal kun dem, som er ældre end 1 uge fjernes.
> Der er både dato og tidspunkt i mit Tidspunkt-felt.

Noget ala dette kunne nok klare det:

DELETE t1 FROM <table> t1
INNER JOIN <table> t2 ON t1.<kolonne 2> = t2.<kolonne 1> t1.<IdentityColumn>
>
t2.<IdentityColumn> WHERE DATE_ADD(<DATOFELT> ,INTERVAL 7 DAY) >
CURRENT_DATE

--
Jakob Andersen



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste