---
title: "Radera alla poster men lämna kvar 10"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/141290-radera-alla-poster-men-lämna-kvar-10"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Steam"
published: "2006-01-22T15:57:16.000Z"
updated: "2009-05-20T12:51:30.000Z"
replies: 25
views: 1524
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/141290-radera-alla-poster-men-lämna-kvar-10"
---

# Radera alla poster men lämna kvar 10

_Sida 1 av 2._

## #1 — Steam, 2006-01-22T15:57Z

Tjena

Det är så att jag håller på och skapar ett meddelande system med möjlighet för skickade meddelanden så att användaren kan tydligt se vilka mess denne har skickat. 

Vad jag vill är att en enskild person inte kan lagra hur många mess som helst utan begränsa antalet till max 10 skickade mess så att det senaste suddas ut så fort den elfte har skickats eller när användaren besöker sin outbox så suddas ut de mess efter den tionde messet.

Hur ska man formulera SQL satsen i det här fallet?

Att köra med DELETE FROM tabell WHERE id \> 10 AND WHERE Anvandare = " & Session("anv") - funkar ju självklart inte med tanke på att det kan finnas tusentals poster (id). 

Kan nån hjälpa mig på traven och hur bör man tänkta i det här fallet?

Permalänk: https://www.webforum.nu/p/141290

## #2 — Peter S, 2006-01-22T16:13Z

DBMS?

Permalänk: https://www.webforum.nu/p/1752728

## #3 — Steam, 2006-01-22T16:15Z

MySQL

Permalänk: https://www.webforum.nu/p/1752729

## #4 — LarsG, 2006-01-22T16:21Z

Flyttas från ASP

Permalänk: https://www.webforum.nu/p/1752731

## #5 — Peter S, 2006-01-22T16:30Z

Vill du behålla de tio senaste meddelandena från den personen? Då kanske du kan göra så här:

```
delete
   from tabell t
  where t.anvandare
      = '" & session("anv") & "'
    and t.id
 not in ( select t2.id 
            from tabell t2
           where t2.anvandare
               = '" & session("anv") & "'
          order
              by <datum> desc
           limit 10)
```

Permalänk: https://www.webforum.nu/p/1752736

## #6 — Steam, 2006-01-22T17:21Z

Tack för svaret. Jag ska labborera nu och se ifall detta går. Kan säga redan nu att jag får  syntax fel near where t.anvanadre. Jag ska se vad som är problem.

Permalänk: https://www.webforum.nu/p/1752757

## #7 — Steam, 2006-01-22T23:55Z

Jag har testat nu ett antal gånger utan att lyckas..  :x 

Såhär ser tabellen "skickat" ut:

id       
tillAnvandare    
anvandare 
amne
mess 
datum   

delete from skickat t where t.anvandare = 2 and t.id not in (select t2.id from skickat t2 where t2.anvandare = 2 order by date desc limit 10);

Såhär ser felmeddelandet ut:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for th
e right syntax to use near 'where t.anvandare = 2 and t.id not in (select t2.id from skickat t2 where' at line 1

Jag använder version 4.1.10b och så vitt jag vet borde det inte föreställa några problem med den versionen.

Permalänk: https://www.webforum.nu/p/1752909

## #8 — Peter S, 2006-01-23T15:58Z

Red./ Jag får lära mig att läsa bättre! Du har ju skickat med den utskrivna SQL-frågan.

Permalänk: https://www.webforum.nu/p/1753075

## #9 — LarsG, 2006-01-23T16:20Z

Mysql stöder inte korrelations namn för tabeller i delete (ser det ut som).
Det är heller inte möjligt att ha limit i en subselect.

Permalänk: https://www.webforum.nu/p/1753094

## #10 — Peter S, 2006-01-23T16:27Z

> **LarsG skrev:**
>
> Det är heller inte möjligt att ha limit i en subselect.

För denna version av MySQL eller generellt?

I referensmanualen för 5.0 går att läsa

> **http://dev.mysql.com/doc/refman/5.0/en/subqueries.html skrev:**
>
> A subquery can contain any of the keywords or clauses that an ordinary SELECT  can contain: DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, index hints, UNION constructs, comments, functions, and so on.

Permalänk: https://www.webforum.nu/p/1753096

## #11 — LarsG, 2006-01-23T16:30Z

Det gäller 4.1 i alla fall.

Permalänk: https://www.webforum.nu/p/1753097

## #12 — K@llen, 2006-01-23T16:32Z

Borde fungera i mysql om jag inte fattat helt knasigt. Tar bort alla meddelanden från en användare utom de 10 senaste.

```
DELETE FROM tabell WHERE Anvandare = " & Session("anv") & " ORDER BY pubDate DESC LIMIT 10, -1
```

Permalänk: https://www.webforum.nu/p/1753099

## #13 — Peter S, 2006-01-23T16:54Z

Läser man vidare i länken jag citerade ovan kan man se följande:

> One restriction is that a subquery's outer statement must be one of: SELECT, INSERT, UPDATE, DELETE, SET, or DO. Another restriction is that currently you cannot modify a table and select from the same table in a subquery. This applies to statements such as DELETE, INSERT, REPLACE, and UPDATE.

Alltså går det att ha LIMIT i subselects [ända från version 4.1](http://dev.mysql.com/doc/refman/4.1/en/subqueries.html) (om det inte är någon bugg som ställer till det). Men det går inte att hämta information från samma tabell som modifieras, som jag gjort.

Permalänk: https://www.webforum.nu/p/1753103

## #14 — LarsG, 2006-01-23T17:19Z

Nej inte generellt detta får jag i 4.1

> Error: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' (State:S1T00, Native Code: 4D3)

för en fråga som ser ut som

```
select 1 
  from t 
  where c1 in 
  (select c1 
     from t 
   order by 
 c1 limit 1)
```

Permalänk: https://www.webforum.nu/p/1753111

## #15 — LarsG, 2006-01-23T17:23Z

K@llen: 

I delete (4.1) kan du bara ange limit \<antalRader\>, dvs inget offset

Permalänk: https://www.webforum.nu/p/1753113

## #16 — K@llen, 2006-01-23T19:54Z

> **LarsG skrev:**
>
> K@llen: 
> 
> I delete (4.1) kan du bara ange limit \<antalRader\>, dvs inget offset

Okey, då har det blivit ändringar sedan sist jag gjorde så. ;)

Permalänk: https://www.webforum.nu/p/1753181

## #17 — Peter S, 2006-01-23T22:35Z

> **LarsG skrev:**
>
> Nej inte generellt detta får jag i 4.1
> 
>
>
> > Error: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' (State:S1T00, Native Code: 4D3)

Knepigt med tanke på vad de skriver i manualen.

Angående

> Another restriction is that currently you cannot modify a table and select from the same table in a subquery.

Hur kommer det sig? Subselecten är väl exekverad och klar när väl DELETE-operationerna sätter in, så vari ligger problemet?

Permalänk: https://www.webforum.nu/p/1753242

## #18 — LarsG, 2006-01-23T22:40Z

Att tillåta subselect utan korrelation till delete/update borde inte vara så knepigt nej. 

Den enda lösningen jag ser på detta problem är att skapa en temptabell med id för de poster som inte skall tas bort.

Permalänk: https://www.webforum.nu/p/1753243

## #19 — Peter S, 2006-01-23T22:49Z

Ok!  :)

Permalänk: https://www.webforum.nu/p/1753245

## #20 — Steam, 2006-01-25T23:51Z

Så det innebär att 10 000 medlemmar t.ex. kommer att skapa temp tabeller när de kollar sin outbox. Det skulle försämra prestandan på servern avsevärt så det skippar jag nog. Jag måste nog använda hjärnan lite mer eller kanske hårdkoda i asp på nåt vis.

Permalänk: https://www.webforum.nu/p/1754159

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/141290-radera-alla-poster-men-lämna-kvar-10  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/141290-radera-alla-poster-men-lämna-kvar-10/page2.md
