/ 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
Slette så der kun er 7 nyeste tilbage i my~
Fra : -Martin-


Dato : 15-07-02 00:08

Jo ...

jeg har en database med en masse priser i noget ala dette her

ID - datetime - pris - vareid

Og så har jeg måske 48 med samme vareid nummer ... og der vil jeg så
gerne slette så der KUN er de 7 nyeste tilbage i min database med
samme vareid

Hvordan kan den klares ?

 
 
Jens Gyldenkærne Cla~ (15-07-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-07-02 22:13

-Martin- skrev:

> ID - datetime - pris - vareid
>
> Og så har jeg måske 48 med samme vareid nummer ... og der vil
> jeg så gerne slette så der KUN er de 7 nyeste tilbage i min
> database med samme vareid


Hvis du kender vareid kan du bruge:

DELETE FROM <tabel>
WHERE ID NOT IN
   (SELECT TOP 7 ID
   FROM <tabel>
   ORDER BY [datetime])
AND vareid = <værdi>


Du kan finde de vareidnumre der har poster der skal slettes med en
GROUP BY-forespørgsel:

SELECT vareid, COUNT(*) AS antal
FROM <tabel>
GROUP BY vareid
WHERE COUNT(*) > 7


Det kan sikkert også lade sig gøre at koble de to forespørgsler
sammen, men det må du selv fifle med. Et simpelt join er ikke nok,
for så vil du også slette poster hvor varenummeret findes mindre
end 7 gange i tabellen.


--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

-Martin- (15-07-2002)
Kommentar
Fra : -Martin-


Dato : 15-07-02 23:10

>Hvis du kender vareid kan du bruge:
>
>DELETE FROM <tabel>
>WHERE ID NOT IN
>    (SELECT TOP 7 ID
>    FROM <tabel>
>    ORDER BY [datetime])
>AND vareid = <værdi>

Se dette kan ikk lade sig gøre i mysql
Ihvertfald ikke i min version 3.23xxx


>
>
>Du kan finde de vareidnumre der har poster der skal slettes med en
>GROUP BY-forespørgsel:
>
>SELECT vareid, COUNT(*) AS antal
>FROM <tabel>
>GROUP BY vareid
>WHERE COUNT(*) > 7

Det ser jo godt ud .. MEEEN tror ikk jeg gik sagt mit spørgsmål højt
nok ;)

Mit datetime felt består jo af en dato ... nej hvor sjovt

Nå men ja, så vil jeg slette alle de felter med samme vareid (som jeg
kender) også slette alle rækker FORUDEN de 7 nyeste rækker (som jo er
sat via datetime feltet)

Jens Gyldenkærne Cla~ (15-07-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-07-02 23:32

-Martin- skrev:

> Se dette kan ikk lade sig gøre i mysql
> Ihvertfald ikke i min version 3.23xxx

Jeg glemmer konstant at mySQL ikke understøtter subselects - det er
en skam.

>>SELECT vareid, COUNT(*) AS antal
>>FROM <tabel>
>>GROUP BY vareid
>>WHERE COUNT(*) > 7
>
> Det ser jo godt ud .. MEEEN tror ikk jeg gik sagt mit
> spørgsmål højt nok ;)

Ikke forstået.


> Mit datetime felt består jo af en dato ... nej hvor sjovt

Det fremgik tydeligt. Ovenstående SQL finder (som jeg skrev)
vareidnumre hvor der er flere end 7 poster i tabellen. Med standard
SQL kan du ikke - SVJV - lave en udvælgelse af de n første poster
for hvert vareid i samme SELECT. Derfor har du brug for først at
finde de numre der indeholder for mange poster, og derefter
behandle dem (slette alt andet end de 7 nyeste).


> Nå men ja, så vil jeg slette alle de felter med samme vareid
> (som jeg kender) også slette alle rækker FORUDEN de 7 nyeste
> rækker (som jo er sat via datetime feltet)

Uden subselects er det ikke så nemt. Jeg tror at min tilgang til
problemet ville være at finde præcis de id-numre der _ikke_ skal
slettes (dvs. de 7 nyeste poster for hvert vareid) og så lave en
sletteforespørgsel der fjerner resten. Hvis de fleste idnumre skal
slettes kan man også overveje at flytte de "rigtige" numre til en
midlertidig tabel, slette hele den oprindelige tabel og så lægge de
gemte poster ind igen.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste