<?php
$sql = "UPDATE logdata
SET firstdate = '0000-00-00 00:00:00'
WHERE lastdate IN (SELECT DATE_SUB(firstdate, INTERVAL 5 MINUTE)
FROM logdata
WHERE pages = 1
)
";
?>
Foutmelding: You can't specify target table 'logdata' for update in FROM clause

Iemand een idee hoe dit op te lossen?

SanThe.
Je kan niet uit een tabel selecteren en er in dezelfde query een insert of update in uitvoeren. Dit zal je dus in twee queries moeten doen. Eerst selecteren, dan updaten.

Edit.... kan je het niet gewoon in een where clause doen....? Dat kan wel, zonder de subquery dus.
Jammer, maar toch bedankt.
Ik had al zo'n idee dat dit in twee keer moest, maar uiteraard toch even proberen.

Toevoeging op 31/12/2013 12:24:35:

Erwin H op 31/12/2013 12:17:50

Edit.... kan je het niet gewoon in een where clause doen....? Dat kan wel, zonder de subquery dus.


Hoe dan?
Zo te zien is het niet van toepassing de edit, aangezien je volgens mij een waarde probeert te vergelijken met waardes uit andere records. Wat dan misschien nog wel kan is een self join gebruiken in plaats van de subquery. Eerlijk gezegd nog nooit geprobeerd, dus ik weet niet of het gaat werken, maar dan zou je zoiets krijgen:

UPDATE logdata a
LEFT JOIN logdata b ON (
  a.lastdate = DATE_SUB(b.firstdate, INTERVAL 5 MINUTE)
  AND b.pages = 1
)
SET a.firstdate = '0000-00-00 00:00:00'
WHERE b.firstdate <> NULL;

(niet getest, dus buiten dat ik niet weet of je zo de zelfde tabel kan joinen kan het ook zijn dat je de query zelf nog iets moet tunen)
Hallo Erwin,

Bedankt. Ik heb aardig wat zitten proberen maar ik kom er niet uit.
Misschien dat een voorbeeldje het wat duidelijker maakt.


firstdate --------------------- lastdate --------------------- aantal
2013-12-31 15:02:41 --- 2013-12-31 15:02:41 --- 1
2013-12-31 15:02:19 --- 2013-12-31 15:02:19 --- 1
2013-12-31 15:01:45 --- 2013-12-31 14:57:19 --- 3


Nu zoek ik de records waarvan het aantal op 1 staat en dan mag er NIET ook een record aanwezig zijn met een lastdate die 5 minuten vroeger is dan firstdate van het te zoeken record. In dit voorbeeldje is dat de eerste rij.

Ik hoop dat dit duidelijker is.

Mijn laatste poging was dit:

UPDATE		logdata a
LEFT JOIN	logdata b
ON	(	a.firstdate	= DATE_ADD(b.lastdate, INTERVAL 5 MINUTE)
	)
SET		.. NVT ..
WHERE	a.pages		= 1
AND		a.id		<> b.id
Niet helemaal duidelijk om eerlijk te zijn. Je zoekt dus records waarvan het aantal op 1 staat. Dat zijn, in het voorbeeldje, de eerste twee rijen. Daarnaast wil je dan ook nog zorgen dat er dan geen record te vinden is waarbij lastdate precies 5 minuten vroeger is. Alleen bij die extra voorwaarde, geldt dan dat aantal van 1 ook? In dit voorbeeld niet als ik het zo zie.

Om het makkelijker te maken, probeer eerst een select query te maken die alle records ophaalt die geupdate moeten worden. Als ik je vraagstelling bekijk dan zou de door mij gegeven query dat moeten doen volgens mij. (iets aangepast want bij nader inzien kan je denk ik gebruik maken van een INNER JOIN)

SELECT a.firstdate
FROM logdata a
INNER JOIN logdata b ON (
  a.lastdate = DATE_SUB(b.firstdate, INTERVAL 5 MINUTE)
  AND b.pages = 1
); 

Het haalt hier alle records op waar er een join gemaakt kan worden met dezelfde tabel, onder de voorwaarde dat lastdate precies 5 minuten voor de firstdate van de join rij zit en waar die join rij een aantal (pages) van 1 heeft. Als zo'n join niet gemaakt kan worden wordt de rij niet geselecteerd.

Overigens kan het hier nu wel voorkomen dat rijen uit a dubbel geselecteerd worden, maar dat lijkt me verder niet een heel groot probleem.
Ik zoek de records met aantal = 1. Hoeveel het aantal van dat andere record met lastdate is, is niet belangrijk. Dus bovenstaand voldoen record 1 en 2. Echter bij 2 is een lastdate record te vinden waardoor record 2 dus toch niet voldoet. Duidelijker zo?

Met die select van jou krijg ik dan toch twee query's?
En welke van de twee moet worden geupdate? Het record met aantal is 1, of de andere?

Die select is alleen om eerst ervoor te zorgen dat je de juiste records weet te vinden in je dataset. Als dat klopt kan je het eenvoudig omschrijven naar een update statement (mits, nogmaals, die update een self join toelaat).
Ik zoek record 1 met aantal 1 en geen te vinden lastdate record.

Ik zal eens met die select gaan testen.

Bedankt zover en je hoort het weer.
Ik denk alleen dat die de voorwaardes verkeerd om staan nu:

SELECT a.firstdate
FROM logdata a
INNER JOIN logdata b ON b.lastdate = DATE_SUB(a.firstdate, INTERVAL 5 MINUTE)
WHERE a.pages = 1;
Hij pakt nu precies de verkeerde. Hij pakt het record waarbij een ander de lastdate heeft. Die moet ik dus niet hebben. Ik moet die ander hebben.

Reageren