[mysql] date_add
Code (php)
1
2
3
2
3
<?php
$query = "SELECT userID FROM berichtalerts WHERE DATE_ADD(datum,INTERVAL 5 HOUR)";
?>
$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.
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
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 >=.
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
Code (php)
1
2
3
2
3
<?php
$query = "SELECT id FROM berichten WHERE userID_ontv = '".$row['userID']."' ORDER BY datum DESC LIMIT 5";
?>
$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.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
DELETE FROM tabel
WHERE id NOT IN (
SELECT id
FROM tabel
ORDER BY datum DESC
LIMIT 5
)
WHERE id NOT IN (
SELECT id
FROM tabel
ORDER BY datum DESC
LIMIT 5
)
Niet getest, maar zoiets zou moeten werken.
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?
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$ids = array();
while($row = mysql_fetch_assoc($res))
{
$ids[] = $row['id'];
}
$ids = implode(',', $ids);
$sql = "
DELETE FROM tabel
WHERE id NOT IN (".$ids.")
";
?>
$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:
code is als volgt:
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
29
30
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
29
30
<?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());
}
?>
$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.
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
Hmm, en als je de array $ids eens print, dus voordat je hem implode? Wat staat er dan in?
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.
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
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.
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.
Dat dacht ik al ja. Maar het werkt nu dus?
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
deze waarschuwing krijg ik zodra de query is uitgevoerd en er geen records meer uit de query komen rollen die de records selecteert die ouder dan 5 uur zijn.
ik heb er al een if statement met een mysql_num_rows voor geplaatst, maar dit helpt niet.
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
29
30
31
32
33
34
35
36
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
29
30
31
32
33
34
35
36
<?php
$query = "SELECT userID FROM berichtalerts WHERE HOUR(TIMEDIFF(NOW(), datum)) >= 5";
$result = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($result) > 0)
{
while($row = mysql_fetch_array($result))
{
$query = "SELECT
id
FROM
berichten
WHERE
userID_ontv = '".$row['userID']."'
ORDER BY
datum DESC
LIMIT 5";
$result = mysql_query($query) or die (mysql_error());
$ids = array();
while($row2 = mysql_fetch_assoc($result))
{
$ids[] = $row2['id'];
}
$ids = implode(',', $ids);
$query = "DELETE FROM
berichten
WHERE
id NOT IN (".$ids.")";
$result = mysql_query($query) or die (mysql_error());
$query = "DELETE FROM berichtalerts WHERE userID = '".$row['userID']."'";
$result = mysql_query($query) or die (mysql_error());
}
}
?>
$query = "SELECT userID FROM berichtalerts WHERE HOUR(TIMEDIFF(NOW(), datum)) >= 5";
$result = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($result) > 0)
{
while($row = mysql_fetch_array($result))
{
$query = "SELECT
id
FROM
berichten
WHERE
userID_ontv = '".$row['userID']."'
ORDER BY
datum DESC
LIMIT 5";
$result = mysql_query($query) or die (mysql_error());
$ids = array();
while($row2 = mysql_fetch_assoc($result))
{
$ids[] = $row2['id'];
}
$ids = implode(',', $ids);
$query = "DELETE FROM
berichten
WHERE
id NOT IN (".$ids.")";
$result = mysql_query($query) or die (mysql_error());
$query = "DELETE FROM berichtalerts WHERE userID = '".$row['userID']."'";
$result = mysql_query($query) or die (mysql_error());
}
}
?>
Dat komt hoogstwaarschijnlijk door hetzelfde puntje als dat ik vertelde over die $row. Je maakt namelijk binnen de while-loop weer een nieuwe $result aan en die wordt bij de eerst volgende loop in de mysql_fetch_array() gestopt.