ik heb de volgende query, hiermee wil ik alles selecteren wat langer dan 5 uur in de db staat.
<?php
$query = "SELECT userID FROM berichtalerts WHERE DATE_ADD(datum,INTERVAL 5 HOUR)";
?>

Als ik me niet vergis zou deze alle resultaten moeten ophalen waarbij de datum 5 uur vooruit is, nu werkt dit niet, want hij geeft alle resultaten gewoon weer.

Daarnaast zoek ik nog een uitbreiding hierop die ervoor zorgt dat oudere resultaten dan 5 uur ook weergegeven worden.

SELECT userID
FROM berichtalerts
WHERE HOUR(TIMEDIFF(NOW(), datum)) < 5

Bovenstaande query geeft alle records die korter dan 5 uur in de database staan. Als je langer dan 5 uur wilt ophalen kun je de < veranderen in >=.
@Blanche, bedankt dit werkt

Nu heb ik nog een andere vraag, ik wil met behulp van deze query een andere query laten uitvoeren op de resultaten die uit deze query komen rollen.

Ik wil uit de tabel berichten alle berichten verwijderen behalve de 5 nieuwste berichten, dus de 5 nieuwste berichten moeten overblijven en voor de rest niets.

Wat voor query moet ik hiervoor bedenken?
Ik had zelf de volgende query bedacht
<?php
$query 	= "SELECT id FROM berichten WHERE userID_ontv = '".$row['userID']."' ORDER BY datum DESC LIMIT 5";
?>

Deze 5 id's zet ik dan in een array, en dan zou ik met een andere query alles kunnen verwijderen behalve deze 5, maar ik weet ten eerste al niet hoe ik dit in een array zet, en ten tweede is dit enorm omslachtig volgens mij, dit moet ook met 1 query kunnen denk ik.
Ik heb alleen geen idee welke.

DELETE FROM tabel
WHERE id NOT IN (
    SELECT id
    FROM tabel
    ORDER BY datum DESC
    LIMIT 5
    )

Niet getest, maar zoiets zou moeten werken.
ik weet helaas ook niet of het werkt, krijg namelijk de volgende foutmelding
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

oftewel, er zal een andere oplossing voor dit probleem gezocht moeten worden. Zijn er nog meer mogelijkheden Blanche?
Dan zit er niets anders op dan die subquery eerst uit te voeren en met behulp van php de tweede query aan te maken. Wat je dan zou kunnen doen is een variabele aanmaken waarin je de laatste vijf records (lees: de id's) gescheiden door een komma zet.
<?php
$ids = array();
while($row = mysql_fetch_assoc($res))
{
$ids[] = $row['id'];
}
$ids = implode(',', $ids);

$sql = "
DELETE FROM tabel
WHERE id NOT IN (".$ids.")
";
?>
Echo voor de zekerheid de query even, om te zien of hij er goed uit komt te zien. Hoe moet ie er dan uit zien? Nou zo:

DELETE FROM tabel
WHERE id NOT IN (1, 4, 12, 23)
Na het echoën van de query blijkt dat in de IN() helemaal geen id's staan, die is helemaal leeg.
code is als volgt:
<?php
$query		= "SELECT userID FROM berichtalerts WHERE HOUR(TIMEDIFF(NOW(), datum)) >= 5";
$result		= mysql_query($query) or die (mysql_error());
while($row = mysql_fetch_array($result))
{
	$query	= "SELECT 
					id
			    FROM 
					berichten
				WHERE
					userID_ontv = '".$userID."'
    			ORDER BY 
					datum DESC
				LIMIT 5";
	$result	= mysql_query($query) or die (mysql_error());
	
	$ids = array();
	while($row = mysql_fetch_assoc($result))
	{
    	$ids[] = $row['id'];	
	}
	$ids = implode(',', $ids);
	
	$query = "DELETE FROM 
				berichten
    			WHERE 
					id NOT IN (".$ids.")";
	$result	= mysql_query($query) or die (mysql_error());
}
?>


EDIT: en er staan voldoende berichten in de tabel, dus daar kan het niet aan liggen, ze zijn niet alreeds verwijderd.
Hmm, en als je de array $ids eens print, dus voordat je hem implode? Wat staat er dan in?
als ik de array met print_r print, dan komt er Array ( ) te staan, een lege array dus.
met mysql_num_rows krijg ik ook 0 terug, dus in die query moet iets fout zijn.
ikweet toch zeker dat er resultaten zouden moeten zijn.
Je gebruikt de variabele $userID, maar waar declareer je die?

ps. Tevens is het niet slim om binnen een whileloop waar je $row als variabele gebruikt, nog een keer $row te gebruiken in een tweede while loop. Die zul je ook even moeten hernoemen voordat het script goed werkt.
met die $row had ik niet direct problemen gehad in dit geval, maar inderdaad wel een goede tip.

wel heb je me hiermee op de goede weg geholpen, want hierdoor ben ik erachter gekomen dat $userID eigenlijk $row['userID'] moest zijn, want die krijgt zijn waarde in de query die de alerts die ouder dan 5 uur selecteert.

Reageren