records verwijderen na 7 dagen
Ik wil in een sql tabel records verwijderen die ouder zijn dan 7 dagen. Het script wat ik er voor heb gemaakt werkt op zich wel maar het gaat heel traag en het lijkt heel veel te vragen van de server. Volgens mij moet het veel makkelijker kunnen.
Hieronder de code die ik heb gemaakt:
Code (php)
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
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$result = mysqli_query($dbCon,"SELECT
*
FROM
test");
while ($row = mysqli_fetch_array($result)){
$id = $row['ID'];
$ivdatum = $row['tijd'];
$ooit = strtotime($ivdatum);
$nu = strtotime('now');
$difference =($nu-$ooit) ;
$aantal_dagen = ceil($difference/86400);
if ($aantal_dagen>=7){
$ouderecords="DELETE FROM test WHERE ID='$id'";
if (!mysqli_query($dbCon,$ouderecords)) {
die('Error: ' . mysqli_error($dbCon));
mysqli_close($dbCon);
}
}
}
?>
$result = mysqli_query($dbCon,"SELECT
*
FROM
test");
while ($row = mysqli_fetch_array($result)){
$id = $row['ID'];
$ivdatum = $row['tijd'];
$ooit = strtotime($ivdatum);
$nu = strtotime('now');
$difference =($nu-$ooit) ;
$aantal_dagen = ceil($difference/86400);
if ($aantal_dagen>=7){
$ouderecords="DELETE FROM test WHERE ID='$id'";
if (!mysqli_query($dbCon,$ouderecords)) {
die('Error: ' . mysqli_error($dbCon));
mysqli_close($dbCon);
}
}
}
?>
Gewijzigd op 25/11/2015 07:31:17 door Martijn K
delete FROM test WHERE tijd<curdate()-7
Sorry, maar hoe zet ik dat in php?
Martijn K op 25/11/2015 07:38:51:
Hoi Jan R
Sorry, maar hoe zet ik dat in php?
Sorry, maar hoe zet ik dat in php?
Precies zoals hij het zegt.
Je moet je DELETE query aanpassen.
Code (php)
1
$query = mysqli_query("DELETE FROM `test` WHERE `tijd` <= hier je voorwaarde plaatsen");
Dit zou al voldoende zijn.
Probeer eerst eens een SELECT te doen op je database waar je in je query alleen de regels ophaalt die je wilt verwijderen. Dan kun je deze later omzetten naar een DELETE statement.
Gewijzigd op 25/11/2015 07:47:52 door Peter K
OK thanks!
Jan R op 25/11/2015 07:37:05:
Zonder lus werken
delete FROM test WHERE tijd<curdate()-7
delete FROM test WHERE tijd<curdate()-7
Dat gaat niet werken:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
> SELECT CAST('2015-12-01' AS DATE) - 7 wrong,
CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct
+ ---------- + ------------ +
| wrong | correct |
+ ---------- + ------------ +
| 20151194 | 2015-11-24 |
+ ---------- + ------------ +
CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct
+ ---------- + ------------ +
| wrong | correct |
+ ---------- + ------------ +
| 20151194 | 2015-11-24 |
+ ---------- + ------------ +
Gewijzigd op 25/11/2015 13:31:42 door Ger van Steenderen
Ger van Steenderen op 25/11/2015 13:29:56:
Dat gaat niet werken:
Jan R op 25/11/2015 07:37:05:
Zonder lus werken
delete FROM test WHERE tijd<curdate()-7
delete FROM test WHERE tijd<curdate()-7
Dat gaat niet werken:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
> SELECT CAST('2015-12-01' AS DATE) - 7 wrong,
CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct
+ ---------- + ------------ +
| wrong | correct |
+ ---------- + ------------ +
| 20151194 | 2015-11-24 |
+ ---------- + ------------ +
CAST('2015-12-01' AS DATE) - INTERVAL 7 DAY correct
+ ---------- + ------------ +
| wrong | correct |
+ ---------- + ------------ +
| 20151194 | 2015-11-24 |
+ ---------- + ------------ +
Bij mij werkt het wel :)
Maar het is inderdaad beter zoals jij het schrijft
Mogelijk is een andere "optimalisatie" op zijn plaats, maar je vertelt niets over:
- het type data
- het gebruik
- de groei van de tabel over tijd
Je zegt "het gaat heel traag en het lijkt heel veel te vragen van de server". Waar blijkt dit uit en wat is de oorzaak daarvan? Dat is hetgene wat je zou moeten oplossen.
Dan gooi je de data ook echt weg. Weet je zeker dat je deze niet op een gegeven moment nodig hebt, bijvoorbeeld om statistieken te verzamelen ofzo? Je zou bijvoorbeeld kunnen overwegen om een extra kolom aan te maken ("deleted" of "active" ofzo) met een index hierop, zodat je enkel relevante/actieve data uit je tabel kunt selecteren als je deze nodig hebt. Maar goed, dit advies kan niet met goed fatsoen gegeven worden als je niets vertelt over de tabel...
Met het weggooien van data los je het probleem niet op, je gaat het enkel uit de weg, en daarmee gooi je (potentieel) een kind met het waswater weg.
Zoals je in het voorbeeld kan zien zet MySQL de datum om naar een integer als je er een integer vanaf trekt.
Als je die dan gaat vergelijken met een datum zet MySQL ook die datum om naar een integer.
Dit kan onverwachte resultaten opleveren.
Het gaat over een tabel waarin gemaakte vragen staan van deelnemers aan een toets. Per dag worden er duizenden vragen gemaakt.
Ik denk dat het traag gaat omdat in Chrome de pagina blijft laden als ik het script oproep. Als ik een
echo "ok";
voor de laatste accolade in het script zet komt er ongeveer een "ok" per seconde in beeld. Daarnaast zie ik dat de records heel langzaam in aantal dalen.
Ik ben niet bang om de data echt weg te gooien want we gaan daar verder niets mee doen.
Ik ben nu nog wel aan het zoeken naar de juiste oplossing want ik weet nog niet hoe ik het script nu moet aanpassen. Ik dacht dat het iets eenvoudigs zou zijn.
Hartelijk bedankt voor alle hulp!
Dus 1 simpele DELETE met de goede voorwaarde zal alle oude vragen verwijderen, zie de post van Peter K voor de SQL en de post van Ger voor de conditie
Code (php)
Gewijzigd op 26/11/2015 10:06:57 door Jan de Laet
$result = mysqli_query($dbCon,"SELECT * FROM test"); En vervolgens de query afvuren vanuit PHP sleurt eerst alle data, de hele tabel, naar je php client en dan alle data door een while halen om te kijken of het al dan niet bewerkt of ge-delete moet worden kost zeeen van tijd. Overigens is dit een veelgemaakte beginnersfout en duidt meestal op een gebrek aan SQL kennis. Veel bewerkingen kunnen direct middels MySQL opgelost worden om onnodig ophalen en verhalen van data te voorkomen.
Maar ja, SELECT * FROM hugetable is niet heel erg handig.
"Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1"
P.S. De records worden wel verwijderd.(en dat is het belangrijkste)
Gewijzigd op 26/11/2015 21:04:55 door Martijn K
Martijn K, laat je sql eens zien. In mijn SQL zit namelijk geen 1.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
CREATE DEFINER=`root`@`localhost` EVENT `testtabel_cleaner`
ON SCHEDULE
EVERY 1 DAY STARTS '2012-06-01 01:34:38'
ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO BEGIN
DELETE FROM testtabel
WHERE tijdstip < CURRENT_DATE - INTERVAL 7 DAY;
END;
ON SCHEDULE
EVERY 1 DAY STARTS '2012-06-01 01:34:38'
ON COMPLETION PRESERVE
ENABLE
COMMENT ''
DO BEGIN
DELETE FROM testtabel
WHERE tijdstip < CURRENT_DATE - INTERVAL 7 DAY;
END;
Mogelijk moet je nog wel eenmalig aan Mysql laten weten dat er dergelijke timers aanwezig zijn.
linkje erbij gezocht: http://www.sitepoint.com/how-to-create-mysql-events/