webForumDet fria alternativet

Radera alla poster men lämna kvar 10

Databaser & SQLur Databashanterare & SQL

25 svar · 1 462 visningar · startad av Steam

Medlem sedan juli 2003169 inlägg
Frågan#1

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?

Medlem sedan dec. 20025 483 inlägg
#2

DBMS?

Medlem sedan juli 2003169 inlägg
#3

MySQL

Medlem sedan dec. 200012 464 inlägg
#4

Flyttas från ASP

Medlem sedan dec. 20025 483 inlägg
#5

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)
Medlem sedan juli 2003169 inlägg
#6

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.

Medlem sedan juli 2003169 inlägg
#7

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.

Medlem sedan dec. 20025 483 inlägg
#8

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

Medlem sedan dec. 200012 464 inlägg
#9

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.

Medlem sedan dec. 20025 483 inlägg
#10

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.

Medlem sedan dec. 200012 464 inlägg
#11

Det gäller 4.1 i alla fall.

Medlem sedan mars 20032 667 inlägg
#12

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
Medlem sedan dec. 20025 483 inlägg
#13

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 (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.

Medlem sedan dec. 200012 464 inlägg
#14

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)
Medlem sedan dec. 200012 464 inlägg
#15

K@llen:

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

Medlem sedan mars 20032 667 inlägg
#16

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å. ;)

Medlem sedan dec. 20025 483 inlägg
#17

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?

Medlem sedan dec. 200012 464 inlägg
#18

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.

Medlem sedan dec. 20025 483 inlägg
#19

Ok! :)

Medlem sedan juli 2003169 inlägg
#20

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.

141 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)