[mySQL] oudste row verwijderen

Pagina: 1
Acties:
  • 144 views sinds 30-01-2008
  • Reageer

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Hallo,

Ik heb een soort van IP log tooltje gemaakt in PHP/MySQL zodat bij elke aanroep van een bepaalde PHP file netjes de gegevens gelogd worden in een MySQL tabelletje;

code:
1
2
@mysql_query("INSERT INTO visitorsips(ip,date,hostname) VALUES ('$ip_address','$the_date','$hostname')");
@mysql_query("DELETE FROM visitorsips WHERE 1 ORDER BY timestamp LIMIT 10");


Nu krijg ik het echter alleen niet voor elkaar om automatisch de oudste entry te wissen! In de handleiding van mySQL staat het volgende bij DELETE;

code:
1
2
3
4
DELETE FROM somelog
WHERE user = 'jcole'
ORDER BY timestamp
LIMIT 1


Alleen ehhmm als ik dat dus aanpas dan werkt het niet :( ... We hebben PHPMYADMIN draaien dus ik heb al heel wat combinaties geprobeerd maar niets heeft het beoogde resultaat. Hij vind vooral de opdracht ORDER BY timestamp erg vervelend volgens mij. Ondanks dat ik een extra veld voor de timestamp heb aangemaakt (14).

Begrijp er niets van, dit moet toch simpel kunnen? Moet ik elke dag handmatig de database entry's wissen. :O

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Aaargghhh! Nooit een @ voor mysql_query zetten.... je wilt toch wel weten wat ie fout doet |:( Wat zegt mysql_error(); ervan?

Verwijderd

Suggestie:

DELETE FROM somelog WHERE user = 'jcole' AND timestamp = min(timestamp)

verwijderd een record uit somelog waar de user jcole is en waar de timestamp gelijk is aan de laagste timestamp...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
sKiLL4: ik denk (maar weet het niet zeker; noch heb ik het geprobeerd) dat je dan alleen de oudste rij wist als de user daarbij 'jcole' is en niet de oudste rij VAN de user 'jcole' (wat je wilt bereiken).

[ Voor 11% gewijzigd door Soultaker op 22-11-2002 23:46 ]


Verwijderd

klopt je hebt gelijk. Zodra de timestamp verschilt van de laatste werkt deze query niet meer. Sorry :(

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
code:
1
2
3
4
5
SQL-query :  
DELETE FROM `visitorsips` WHERE user = 'web02009' ORDER BY timestamp LIMIT 1 

MySQL retourneerde: 
You have an error in your SQL syntax near 'ORDER BY timestamp LIMIT 1' at line 1


code:
1
2
3
4
5
SQL-query :  
DELETE FROM `visitorsips` WHERE 1 ORDER BY timestamp LIMIT 1 

MySQL retourneerde: 
You have an error in your SQL syntax near 'ORDER BY timestamp LIMIT 1' at line 1


code:
1
2
3
4
5
SQL-query :  
DELETE FROM visitorsips WHERE 1 AND timing = min( timing ) 

MySQL retourneerde: 
Invalid use of group function

Word er een beetje irri van... Enige wat werkt is;

code:
1
DELETE FROM `visitorsips` WHERE date = '2002-11-22 02:02'

Maarja met zo'n opzet loopt het nooit 100%.

Want er komt helaas niet elke minuut een bezoeker, anders had ik kunnen zeggen: schrijf ip,hostname en datum weg en delete daarna meteen alle rijen met de huidige tijd - 23:59u ofzoiets.

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Heb je wel een veld met de naam timestamp ?
Zonee, waarom order je dan niet op date??

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
WHERE 1

??

[ Voor 76% gewijzigd door maartenvdv737 op 23-11-2002 10:42 ]

Ik blijf er iig vrij nuchter onder....


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
ORDER BY and using multiple tables in the DELETE statement is supported in MySQL 4.0.
http://www.mysql.com/doc/en/DELETE.html

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • MrData
  • Registratie: Februari 2000
  • Laatst online: 25-07-2022
Where 1 geeft PHP my Admin automatisch mee als je een query opzet...

"We set sail on this new sea because there is new knowledge to be gained and new rights to be won." - John F. Kennedy - USS Valiant NCC-74210 dedication plaque


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
2
3
4
5
6
DELETE
FROM somelog
WHERE user = 'jcole'
AND timestamp = (SELECT MIN(timestamp)
                              FROM somelog
                              WHERE user = 'jcole')

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
robjanssen schreef op 23 November 2002 @ 11:47:
code:
1
2
3
4
5
6
DELETE
FROM somelog
WHERE user = 'jcole'
AND timestamp = (SELECT MIN(timestamp)
                              FROM somelog
                              WHERE user = 'jcole')
Het gaat hier nog steeds om MySQL hoor ;)
En wat ACM zegt is het enige wat je nodig hebt. Hoe moet MySQL weten wat de oudste entry is, als men geen timestamp bijhoudt in de tabel? Je moet dus een collumn timestamp maken die je met inserten op NOW() oid zet.

[rml]bigtree in "[ mySQL] oudste row verwijderen"[/rml] : gaat niet op, het gaat hier niet om multiple collumn's tables in de order by, dus dit werkt netjes in 3.nogwat

[ Voor 5% gewijzigd door Glimi op 23-11-2002 13:09 . Reden: excuus :) foutje ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
doe toch gewoon 2 querys???? als er toch niet elke minuut iemand komt?

SELECT id as blabl FROM whatever WHERE min(timestamp)
DELETE id From Blabla..

keep it simple

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Ja sorry jongens, het kan zijn dat ik op dit punt ergens iets heel erg mis heb, maar het werkt toch niet op de een of andere manier. Ja ik heb een veld genaamd timestamp en zoals je hier ziet;

code:
1
2
3
4
5
SQL-query :  
DELETE FROM `visitorsips` ORDER BY `date` LIMIT 1 

MySQL retourneerde: 
You have an error in your SQL syntax near 'ORDER BY `date` LIMIT 1' at line 1


Hij accepteert het orderen bij date zelfs niet. Tis wazig.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# phpMyAdmin MySQL-Dump
# version 2.3.2
# http://www.phpmyadmin.net/ (download page)
#
# Host: localhost
# Generatie Tijd:  23 Nov 2002 om 12:12
# Server versie: 3.23.53
# PHP Versie: 4.1.2
# Database : `web02009`
# --------------------------------------------------------

#
# Tabel structuur voor tabel `visitorsips`
#

CREATE TABLE visitorsips (
  ip varchar(20) NOT NULL default '',
  date varchar(16) NOT NULL default '',
  hostname varchar(50) NOT NULL default '',
  timestamp timestamp(14) NOT NULL
) TYPE=MyISAM;


Het lijkt erop dat de DELETE functie alleen maar werkt als er met een gespecificeerd WHERE variabele gewerkt wordt en anders niet, dat is toch onhandig?

---
En bigtree, ik heb de handleiding al doorgenomen, zie mijn linkje in mijn eerste poging. Ik heb behoorlijk wat moeite gedaan om zelf uit te vinden -hoe het moet- maar na een paar uur geGoogle heb ik me er even bij neergelegd |:(

Ik kom ook nergens een goed (werkend) voorbeeld tegen van iemand anders die een oldest database entry automatisch laat verwijderen zodra er een nieuwe database entry wordt weggeschreven.

---
Anders moet ik maar een "namaak" veld extra aanmaken, genaamd "user" en dat ie elke keer "jcole" daarin wegschrijft ofzo (bijvoorbeeld). Maar dat is dan wazig als het op zo'n manier moet, perse.

[ Voor 11% gewijzigd door nl2dav op 23-11-2002 12:22 ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
oh ID is natuurlijk een indexed auto_increment key he ;)

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Glimi schreef op 23 november 2002 @ 11:57:
[...]
[rml]bigtree in "[ mySQL] oudste row verwijderen"[/rml] : gaat niet op, het gaat hier niet om multiple collumn's in de order by, dus dit werkt netjes in 3.nogwat
Het stukje dat ik quootte sprak van multiple tables, niet columns. En volgens mij betekent het stukje ook dat ORDER BY op zich pas gesupport wordt bij versie 4+.

Dan even iets anders nl2dav; waarom wil je bij elke insert ook weer een record verwijderen? Betaal je je provider per opgeslagen record? ;) Je kan toch ook aan je weergave-kant een LIMIT inbouwen? Dat heeft hetzelfde effect. Tenzij je per record betaalt uiteraard. :*)

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Nou, elke dag zijn de gegevens die ik opsla in die table zo'n 0,5 Mb bij elkaar. Als je dat over een week gaat bekijken is dat 3,5 Mb. In een maand is dat 14 Mb en in een jaar 728 Mb... Snapje?

Waarom ruimte gebruiken als je eigenlijk alleen maar de gegevens van een dag, per dag wil hebben. Snapje mijn punt een beetje?

Ruimte genoeg opzich maar overdrijven hoeft ook niet toch? :p

Bovendien is dat het omzeilen van het hele probleem en ik dacht dat zoiets simpels als dit wel te realiseren moest zijn ;).

De weergavekant heb ik allang gelimiteerd maarja die database wordt voller en voller terwijl dit eigenlijk nog peanuts is qua gegevens die ie tijdelijk opslaat. Stel je voor als ik nog meer zou willen. Dan moet ik eens in de zoveel tijd handmatig de boel compleet legen en ik dacht juist dat de computer er was om het leven gemakkelijker te maken :)

Ik heb trouwenseven gestoeit met hobbit_be's idee... Maarrem... Wel een extra ID veld aangemaakt met auto-increment functie e.d. maar zodra die delete functie weer om de hoek komt kijken dan krijg ik weer een error om de oren })

[ Voor 1% gewijzigd door nl2dav op 23-11-2002 13:13 . Reden: typo's ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09-2025
SELECT * FROM table ORDER BY timestamp ASC LIMIT 0,1

Oudste bovenaan en anders is het DESC :?

[ Voor 4% gewijzigd door supakeen op 23-11-2002 13:13 ]


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
zmn schreef op 23 November 2002 @ 13:13:
SELECT * FROM table ORDER BY timestamp ASC LIMIT 0,1

Oudste bovenaan en anders is het DESC :?
Yep dat gaat goed en dan de eerste entry (oudste die bovenaan staat dus) deleten. Dat ziet ie dus niet zitten.

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
nou als die query SELECT uniqueid as id FROM table ORDER BY timestamp ASC LIMIT 0,1 een row weergeeft, dan doe je gewoon de DELETE * FROM table WHERE uniqueid = id...

als je nog geen id's (of keys gebruikte) moet je dat nu alvast doen. Keys kunnen op tabellen > 10000 ENORME verschillen maken (de Index zitten namelijk in het geheugen. zo'n Delete query met een KEY = 32 kost dus bijna niets. (read MySQL specs). Oh en nog iets simple je kunt die ID dan in aparte table/row opslaan met daarin de ID van de laatste (dus geen Query met sorting op DATETIME (pijnlijk). dus je doet een insert van een row en je vraagt de
gecreerde ID terug -> mysql_lastid (of zoiets is al een tijdje geleden). Dan dan hou je die bij en delete die bij de volgende -> als ze steeds elkaar opvolgen doe je je INSERT gevolgd door een DELETE Where ID = lastid - 1. Et voila SUPERSNEL geen DateTime gekloot en tamelijk eenvoudig...

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
OlafvdSpek schreef op 23 november 2002 @ 13:39:
[...]

En welke versie van MySQL heeft nl2dav dan?
De nieuwste (3.23.53) zie een gepost stukje code elders in deze thread ;)

Ik ga eens verder proberen.

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Dus
SELECT * FROM visitorsips ORDER BY date ASC LIMIT 0,1
werkt en geeft iid de entry die je wilt verwijderen?

En
DELETE FROM visitorsips ORDER BY date ASC LIMIT 0,1
geeft een foutmelding?

(Hoe ziet je tabel er nou eigenlijk uit)

| Toen / Nu


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
nl2dav schreef op 23 november 2002 @ 18:09:
[...]


De nieuwste (3.23.53) zie een gepost stukje code elders in deze thread ;)

Ik ga eens verder proberen.
Weet je zeker dat het in 3 wel mogelijk is en dat je niet 4 nodig hebt?
3.23.49:
code:
1
2
3
DELETE [LOW_PRIORITY] FROM tbl_name
    [WHERE where_definition]
    [LIMIT rows]

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
OlafvdSpek schreef op 23 november 2002 @ 20:26:
[...]

Weet je zeker dat het in 3 wel mogelijk is en dat je niet 4 nodig hebt?
3.23.49:
code:
1
2
3
DELETE [LOW_PRIORITY] FROM tbl_name
    [WHERE where_definition]
    [LIMIT rows]
Ja want als je het letterlijk overneemt dan werkt het WEL ...

Dus als ik bijv. een entry heb met bijv. een kolom met: "23-11-2002 11:53" en ik zeg;

code:
1
DELETE FROM tbl_name WHERE date = '23-11-2002 11:53'


Dan worden netjes alle regels verwijderd met "23-11-2002 11:53" daarin. Maar zodra ik bijv. WHERE achterwege wil laten en iets met ORDER BY wil doen dan geeft ie een error.

Nog even en ik word er echt gek van 8)7

[ Voor 33% gewijzigd door nl2dav op 23-11-2002 20:59 ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
nl2dav schreef op 23 November 2002 @ 20:52:
Ja want als je het letterlijk overneemt dan werkt het WEL ...
Ja, maar volgens mij is de ORDER optie dus pas in 4 toegevoegd.

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Ok, dan doe je eerst een query om te bepalen welke entry de laatste is, daarna doe je een delete query om alleen die entry te verwijderen.

| Toen / Nu


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
SuperRembo schreef op 23 november 2002 @ 18:28:
Dus
SELECT * FROM visitorsips ORDER BY date ASC LIMIT 0,1
werkt en geeft iid de entry die je wilt verwijderen?

En
DELETE FROM visitorsips ORDER BY date ASC LIMIT 0,1
geeft een foutmelding?

(Hoe ziet je tabel er nou eigenlijk uit)
Helemaal correct! De eerste opdracht geeft inderdaad de row weer die ik zou willen verwijderen maar de tweede opdracht geeft een error.

Dit is momenteel mijn tabel;

code:
1
2
3
4
5
6
7
8
9
10
11
12
#
# Tabel structuur voor tabel `visitorsips`
#

CREATE TABLE visitorsips (
  id int(11) NOT NULL auto_increment,
  ip varchar(20) NOT NULL default '',
  date varchar(16) NOT NULL default '',
  hostname varchar(50) NOT NULL default '',
  timestamp timestamp(14) NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;


:/

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
hobbit_be schreef op 23 November 2002 @ 13:26:
nou als die query SELECT uniqueid as id FROM table ORDER BY timestamp ASC LIMIT 0,1 een row weergeeft, dan doe je gewoon de DELETE * FROM table WHERE uniqueid = id...
Die eerste regel geeft alleen het ID veld weer na uitvoering, niet de hele row... Maargoed dat zou niet superernstig zijn ware het niet dat het * 'tje bij DELETE * FROM ook niet toegestaan is.
[...]
dus je doet een insert van een row en je vraagt de
gecreerde ID terug -> mysql_lastid (of zoiets is al een tijdje geleden). Dan dan hou je die bij en delete die bij de volgende -> als ze steeds elkaar opvolgen doe je je INSERT gevolgd door een DELETE Where ID = lastid - 1. Et voila SUPERSNEL geen DateTime gekloot en tamelijk eenvoudig...
Eehh ja...

Alleen werkt dat ook niet, omdat je op deze wijze niet de oudste entry (namelijk een entry van 5000 rows terug) verwijderd maar de voorgaande entry. Wat wel weer zou kunnen is delete where id = lastid - 5000 ofzo ... Ik vraag me dan alleen af of dat wel goed gaat functioneren. Wel vervelend om te bouwen ook trouwens ;)

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Zoals OlafvdSpek as suggereerde mag je dus in de MySql verise die jij gebruikt geen ORDER BY in een DELETE query gebruiken.
SuperRembo schreef op 23 November 2002 @ 21:03:
Ok, dan doe je eerst een query om te bepalen welke entry de laatste is, daarna doe je een delete query om alleen die entry te verwijderen.
SELECT id FROM visitorsips ORDER BY date ASC LIMIT 0,1

DELETE FROM visitorsips WHERE id=idtodelete

| Toen / Nu


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
OlafvdSpek schreef op 23 november 2002 @ 21:02:
[...]
Ja, maar volgens mij is de ORDER optie dus pas in 4 toegevoegd.
Dat idee krijg ik zo onderhand ook :(

Ik moet dat eens laten testen. Dan zou je zeggen dan installeer je toch 4.0? Jawel dat kan wel maar helaas denken providers daar niet net zo makkelijk over ;)

Ik lees wel dat ze flink hebben zitten sleutelen aan die delete instructie. Jammer genoeg is er niet een echt duidelijke version history met changes :|

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Nou oke dit werkt dus alleen maar echt fijn in 4.0.. Duidelijk. (ik heb deze topic nog eens grondig compleet opnieuw gelezen)

Ik ga nog een beetje stoeien met de manieren die wel toegestaan zijn in 3.23.53 maar ik snap nu waarom mijn DELETE instructies nu eigenlijk niet werken terwijl ik notabene wel de manual gelezen heb op dat punt |:(
(zoals de readme-first-before-you-post hier voorschrijft hehe)

Allen, bedankt voor de hulp. Ik ga nog even verder met een ander project (http://gathering.tweakers.net/forum/list_messages/649842 LOL)

[ Voor 3% gewijzigd door nl2dav op 23-11-2002 22:11 ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Als ik je goed begrijp wil je alleen de gegevens van hooguit de afgelopen 2 dagen weten, dan kun je toch 'DELETE FROM visitorsips WHERE date < timestampVan2DagenGeleden' doen?
Dat er dan soms niets wordt gewist en soms meer dan 1 record maakt niet zoveel uit, aangezien de enige reden van het deleten is dat je database niet te groot mag worden.
De methode die je in de 1e post beschrijft, heeft trouwens nog het nadeel dat je eerst je tabel zal moeten vullen met een aantal records. Dit aantal records blijft vervolgens altijd gelijk. Als je database niet vantevoren vult met gegevens, zal de deletequery meteen de insertquery ongedaan maken.
Nog een nadeel is dat als je bijv 500 records in je tabel hebt, maar ineens 1000 bezoekers per dag hebt, je de 1e 500 bezoekers kwijt raakt.

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Huhm.. timestamp van 8 getallen lang (dat is alleen de datum) en dan

huidige timestamp - 2 (= 2 dagen terug)

en dan in de query zetten? Hmmm :/

Zou kunnen misschien... Wordt alleen een beetje ontmoedigt door al die errors zo onderhand. Straks nog maar ff proberen.

EDIT:
DELETE FROM visitorsips WHERE date < 20021121121714

oeps, dat verwijderde alle records tot op de minuut van momenteel :)

(denk dat het < omgeklapt hoort te worden naar > ... Is dat logisch (?) )

[ Voor 31% gewijzigd door nl2dav op 23-11-2002 22:28 ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
nl2dav schreef op 23 november 2002 @ 22:16:
(denk dat het < omgeklapt hoort te worden naar > ... Is dat logisch (?) )
Hmmm... misschien tijd om een andere hobby te zoeken :X

[ Voor 3% gewijzigd door SuperRembo op 23-11-2002 23:14 ]

| Toen / Nu


  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
SuperRembo schreef op 23 november 2002 @ 23:13:
[...]

Hmmm... misschien tijd om een andere hobby te zoeken :X
Mwah leuke opmerking maar het is geen hobby, maargoed niet een intelligente opmerking dus. Je antwoord had iets behulpzamer kunnen zijn maar ach :p

Anyway het moest natuurlijk

DELETE FROM visitorsips WHERE timestamp < 20021121233957

zijn...

Waarbij 20021121233957 een resultaat zou kunnen zijn van een eerdere berekening van (actuele timestamp - 20000000), in geval van 2 dgn...

Het ziet er ook naar uit dat dit werkt.

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


Verwijderd

Door al het geblaat is het me een beetje ontgaan, maar je wilt dus alle gegevens van een dag of ouder wissen en je hebt een MySQL timestamp field? Dat moet wel lukken:

code:
1
2
3
4
5
DELETE FROM
    visitorships
WHERE
    YEAR(visitorships.timestamp) < YEAR(CURRENT_TIMESTAMP) OR
    DAYOFYEAR(visitorships.timestamp) < DAYOFYEAR(CURRENT_TIMESTAMP)


Zoiets zoek je iig, mischien moet je de timestamp eerst nog formatteren oid.

  • nl2dav
  • Registratie: Juni 2001
  • Laatst online: 26-08 00:42
Oke even resumerend;

Officieel wilde ik de oudste database entry wissen bij elke opnieuwe geinserte entry. Maar als dat al mogelijk zou zijn in 3.23.53, dan is dat erg omslachtig te realiseren. In 4.0.x hebben ze daar schijnbaar een oplossing voor gevonden door aan het DELETE command ook ORDER BY toe te staan.

Helaas heb ik niet de beschikking over 4.0.x en is inderdaad (voor mijn doel) het ook een goede oplossing om dan alles wat ouder als een dag is te wissen.

Met dank aan de verschillende posters _/-\o_ heb ik nu de volgende code gemaakt;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//collect user and time information
$ip_address = $REMOTE_ADDR;
$hostname= gethostbyaddr($ip_address);
$the_date = date("d-m-Y H:i:s");
$yesterday = date("YmdHis") - "1000000";
//connect to MySQL
$conn = mysql_connect("localhost","databasename","passw") or die("cannot connect to MySQL");
//select our database
mysql_select_db("databasename") or die("cannot connect to the database");
//execute the query in the visitorsips table
mysql_query("INSERT INTO visitorsips(ip,date,hostname) VALUES ('$ip_address','$the_date','$hostname')");
mysql_query("DELETE FROM visitorsips WHERE timestamp<$yesterday");
//close the connection
mysql_close($conn);


* NB: databasename en passw zijn nu even fictief gekozen gegevens uiteraard ;), en hoort eigenlijk in een require inc. bestand maargoed, even voor het beeld.

Met dank aan iedereen voor de ideeen dus! (anders had ik het allang opgegeven). Helaas dekt de topic titel niet meer de lading maarja. Voor de 4.0.x (beta) gebruikerszal het niet zo'n probleem zijn. Jammer dat het zo lang moest duren maarja dat kwam mede door de manual die al standaard uit gaat van 4.0.x gebruikers 8)7 |:(

Het zou nog verder versimpeld kunnen worden want ik gebruik nu een beetje een overkill aan tijd/data opslag. Zou alleen een tijdstamp kunnen nemen en die OOK omschrijven naar een leesbare datum/tijd ipv dat ik date() opsla in een net formaat. Maargoed ik vind het wel best zo :z :O :)

[ Voor 13% gewijzigd door nl2dav op 24-11-2002 02:11 ]

Q350 ERV+Svenar controller Wifi+ComfoClime24 Ubbink aerfoam / Air Excellent & Renson Easyflex


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
nl2dav schreef op 23 november 2002 @ 22:09:
Ik ga nog een beetje stoeien met de manieren die wel toegestaan zijn in 3.23.53 maar ik snap nu waarom mijn DELETE instructies nu eigenlijk niet werken terwijl ik notabene wel de manual gelezen heb op dat punt |:(
(zoals de readme-first-before-you-post hier voorschrijft hehe)
Je kunt beter de manual in je MySQL dir lezen dan een andere versie. Daar staat volgens mij nog niets over 4.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
yow dude.

toch effe een paar comments :)

$result_id = mysql_query("SELECT id FROM table ORDER BY timestamp ASC LIMIT 0,1");
$temp_array = mysql_fetch_assoc($result_id);
$lastid = $temparray_array["id"];
mysql_query("DELETE FROM table WHERE id = $lastid");

werkt natuurlijk wel (effe vergeten dat DELETE idd geen * doet omdat de defualt is)
(je kunt die code ook in SQL steken, met de @ symbolen,maar heb ik geen tijd voor).

dan nog je comment dat last_id - 1 niet werkt? omdat je zegt dat dat dan de vorige
entry delete. maar ik nam aan dat je niet eerst een entry krijgt van 1.00PM gevolgd door 12.00AM op dezlefde dag. maw. de laatste entry is steeds de laatste entry??? (tenzij
je niet met GMT tijd werkt).

Nu ja je blijkt tevreden met wat je hebt and if it ain't broke don't fix it zou ik zeggen...

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
en een INSERT / DELETE == UPDATE ;)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
hobbit_be schreef op 24 november 2002 @ 12:02:
en een INSERT / DELETE == UPDATE ;)
Nee, dan heb je replace / delete nodig. Of eerste delete, dan insert.

[ Voor 8% gewijzigd door Olaf van der Spek op 24-11-2002 12:16 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
oh en ik bedenk net: als jij telkens de oudste entry wil vervangen (ENTRY als enkelvoud) dan heb je noiit meer dan 1 row he. Dus je will alle entryS (meervoud) deleten die ouder
zijn dan een bepaalde datum...

zoals altijd: de vraag is the main culprit...

tsss ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

[nohtml]
nl2dav schreef op 23 november 2002 @ 12:19:
Hij accepteert het orderen bij date zelfs niet. Tis wazig.

code:
1
2
3
4
5
6
CREATE TABLE visitorsips (
  ip varchar(20) NOT NULL default '',
  <b>date <i>varchar(16)</i></b> NOT NULL default '',
  hostname varchar(50) NOT NULL default '',
  timestamp timestamp(14) NOT NULL
) TYPE=MyISAM;
Het zal sowieso schelen als je een date-veld ook van een date en/of time type maakt ipv van een varchar ;)
Maar daar zou ie alsnog wel op moeten kunnen sorteren.
Pagina: 1