[MySQL] Records tellen en deleten in 1 query

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
In onderstaande tabel "paths" houd ik van elke bezoeker het klikpad door de site bij. "vid" Staat hierbij voor visitor id. Van elke vid staan dus een x aantal rijen in de paths tabel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+-----+---------+---------+
| vid | value a | value b |
+-----+---------+---------+
|   1 | .....   | ....... |
+-----+---------+---------+
|   2 | .....   | ....... |
+-----+---------+---------+
|   2 | .....   | ....... |
+-----+---------+---------+
|   2 | .....   | ....... |
+-----+---------+---------+
|   5 | .....   | ....... |
+-----+---------+---------+
|   9 | .....   | ....... |
+-----+---------+---------+
|   9 | .....   | ....... |
+-----+---------+---------+
|  15 | .....   | ....... |
+-----+---------+---------+
|  15 | .....   | ....... |
+-----+---------+---------+
|  15 | .....   | ....... |
+-----+---------+---------+
|  15 | .....   | ....... |
+-----+---------+---------+
Omdat ik de tabel niet te groot wil laten worden, wil ik van een maximaal aantal bezoekers hun klikpad bijhouden. Als voorbeeld hier: van de laatste drie bezoekers. Via een cronjob wil ik de eerdere bezoeken uit de tabel verwijderen.

Voor de duidelijkheid: ik wil hier de records met vid 15, 9 en 5 laten staan. De records met vid 1 en 2 moeten verwijderd worden; het liefst met maar 1 delete query. Ik heb alleen geen idee hoe je zo'n query op moet bouwen: het aantal bezoekers (lees: aantal unieke vid's) is onbekend en ook het aantal records per vid.

Ik weet het alleen maar op te lossen mbv meerdere queries:
  • select distinct het aantal vids
  • sorteer aflopend op vid (15, 9, 5, 2, 1)
  • stop de vid's in een array in PHP
  • kijk wat de derde vid is (in dit geval 5)
  • delete from paths where vid < 5
Dit is volgens mij alleen zo omslachtig. Wie helpt mij op weg met een delete query dit dit alles in de database doet?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Datum veld toevoegen en dan alle records verwijderen die X dagen oud zijn?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Een tijdsgebonden opruiming is zeker ook een goed idee, maar eigenlijk vind ik het niet eens zo omslachtig wat in de TS staat?

Je hebt eerst een query op 1 veldje waar ongetwijfeld een index op ligt, welke je aflopend sorteert met een limit van 3. En vervolgens een delete met 1 voorwaarde.
Dat zijn 2 hele lichte queries, dus zie er eigenlijk het probleem niet van in. :)

{signature}


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Voutloos schreef op zaterdag 29 oktober 2005 @ 14:08:
[...]
maar eigenlijk vind ik het niet eens zo omslachtig wat in de TS staat?
Het is dan ook geen groot probleem, en ws. vreet een ingewikkelder query meer resources dan deze twee kleine queries met wat PHP code. Ik houd mijn code alleen zo compact en duidelijk mogelijk, en in dat kader vroeg ik mij af of ik ook in 1 query deze bewerking kon doen :) Dus nog steeds -- als iemand dit in 1 query kan, hoor ik het graag!

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."