Forum subcategorie gelezen of niet
forum_berichten:
ID (INT), forum_topic_id (INT), datum (Datetime)
forum_topics:
ID (INT), forum_subcategorie_id (INT)
forum_gelezen:
gebruiker_id (INT), forum_topic_id (INT)
Je hebt een subcategorie met daarin topics. Als een van die topics ongelezen is dan is de subcategorie ook ongelezen. Of terwijl de subcategorie krijgt een icoontje dat er nog een ongelezen topic is in die subcategorie.
Wanneer is een topic ongelezen:
- Als een topic datum ouder is dan registratiedatum van de gebruiker
- De Topic_id niet voorkomt in forum_gelezen tabel
- Laatste bericht in dat topic jonger is dan 2 maanden
Nu probeer ik daar een nette sql query van te maken maar het wil me niet lukken.
Dit is wat ik tot nu toe heb:
'SELECT CASE WHEN DATE_ADD("'. mysql_real_escape_string($gebruikers['registratiedatum']) .'") > DATE_ADD(datum, INTERVAL 2 MONTH) THEN 1 ELSE 0 END AS gelezen FROM forum_subcategorie WHERE ID = 1'
Kan iemand mij verder helpen?
Gewijzigd op 01/01/1970 01:00:00 door Zero XT
iemand?
Aantal topics waarvan een bericht jonger is dan 2 maand - aantal topics die daarvan gelezen zijn.
(Heb hier even geen rekening gehouden met registratiedatum topics omdat enkel een datum bij een bericht opgeslaan wordt)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
(
SELECT COUNT(*)
FROM topics
JOIN berichten ON (topics_id)
WHERE NOW() - INTERVAL 2 MONTH < berichten.datum
AND topics.categorie_id = :cat_id
GROUP BY topics.topics_id
) > (
SELECT COUNT(*)
FROM topics
JOIN berichten ON (topics_id)
JOIN gelezen ON (topics_id)
WHERE NOW() - INTERVAL 2 MONTH < berichten.datum
AND topics.categorie_id = :cat_id
AND gelezen.user_id = :user_id
GROUP BY topics.topics_id
) AS ongelezen;
(
SELECT COUNT(*)
FROM topics
JOIN berichten ON (topics_id)
WHERE NOW() - INTERVAL 2 MONTH < berichten.datum
AND topics.categorie_id = :cat_id
GROUP BY topics.topics_id
) > (
SELECT COUNT(*)
FROM topics
JOIN berichten ON (topics_id)
JOIN gelezen ON (topics_id)
WHERE NOW() - INTERVAL 2 MONTH < berichten.datum
AND topics.categorie_id = :cat_id
AND gelezen.user_id = :user_id
GROUP BY topics.topics_id
) AS ongelezen;
Zou een true of false moeten leveren
Dit zijn de uitgeklede tables:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Tabel forum_berichten:
ID int(11) unsigned NOT NULL auto_increment
forum_topic_id int(11) unsigned NOT NULL
datum datetime NOT NULL
Tabel forum_categorie:
ID int(10) unsigned NOT NULL auto_increment
datum` datetime NOT NULL
Tabel forum_gelezen:
gebruiker_id int(10) unsigned NOT NULL
forum_topic_id int(10) unsigned NOT NULL
Tabel forum_subcategorie
ID int(10) unsigned NOT NULL auto_increment
forum_categorie_id int(3) unsigned NOT NULL
datum` datetime NOT NULL
Tabel forum_topics:
ID int(11) unsigned NOT NULL auto_increment
forum_subcategorie_id int(3) unsigned NOT NULL
datum datetime NOT NULL
ID int(11) unsigned NOT NULL auto_increment
forum_topic_id int(11) unsigned NOT NULL
datum datetime NOT NULL
Tabel forum_categorie:
ID int(10) unsigned NOT NULL auto_increment
datum` datetime NOT NULL
Tabel forum_gelezen:
gebruiker_id int(10) unsigned NOT NULL
forum_topic_id int(10) unsigned NOT NULL
Tabel forum_subcategorie
ID int(10) unsigned NOT NULL auto_increment
forum_categorie_id int(3) unsigned NOT NULL
datum` datetime NOT NULL
Tabel forum_topics:
ID int(11) unsigned NOT NULL auto_increment
forum_subcategorie_id int(3) unsigned NOT NULL
datum datetime NOT NULL
Ik voer eerst een query uit om de forum_categorie op te halen:
Code (php)
Ik had in mijn eerste post vergeten dat de forum_topic tabel wel een datum heeft. Mijn excuses.
Ik heb jouw query omgebouwd tot dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT ID, titel, uitleg, status,
(
SELECT COUNT(*)
FROM forum_topics
JOIN forum_berichten ON (forum_topics.ID)
WHERE NOW() - INTERVAL 2 MONTH < forum_berichten.datum
AND forum_topics.forum_subcategorie_id = forum_subcategorie.ID
GROUP BY forum_topics.ID
) > (
SELECT COUNT(*)
FROM forum_topics
JOIN forum_berichten ON (forum_topics.ID)
JOIN forum_gelezen ON (forum_topics.ID)
WHERE NOW() - INTERVAL 2 MONTH < forum_berichten.datum
AND forum_topics.forum_subcategorie_id = forum_subcategorie.ID
AND forum_gelezen.gebruiker_id = '". mysql_real_escape_string($gebruikers['ID']) ."'
GROUP BY forum_topics.ID
) AS ongelezen
FROM forum_subcategorie
WHERE forum_categorie_id = '". mysql_real_escape_string($line_c['ID']) ."'
ORDER BY positie
(
SELECT COUNT(*)
FROM forum_topics
JOIN forum_berichten ON (forum_topics.ID)
WHERE NOW() - INTERVAL 2 MONTH < forum_berichten.datum
AND forum_topics.forum_subcategorie_id = forum_subcategorie.ID
GROUP BY forum_topics.ID
) > (
SELECT COUNT(*)
FROM forum_topics
JOIN forum_berichten ON (forum_topics.ID)
JOIN forum_gelezen ON (forum_topics.ID)
WHERE NOW() - INTERVAL 2 MONTH < forum_berichten.datum
AND forum_topics.forum_subcategorie_id = forum_subcategorie.ID
AND forum_gelezen.gebruiker_id = '". mysql_real_escape_string($gebruikers['ID']) ."'
GROUP BY forum_topics.ID
) AS ongelezen
FROM forum_subcategorie
WHERE forum_categorie_id = '". mysql_real_escape_string($line_c['ID']) ."'
ORDER BY positie
Problemen:
- Er word nog niet gekeken of de topic nieuwer is dan de gebruikers registratiedatum ($gebruikers['registratiedatum'])
- Wanneer er een topic in de forum_gelezen tabel staat dan geeft $line['ongelezen'] bij alle subcategorieen een 0 terug (Wanneer er geen record in forum_gelezen staat geeft $line['ongelezen'] niets terug)
Hoe moet ik dit aanpakken?
Gewijzigd op 01/01/1970 01:00:00 door Zero XT
Kan iemand mij aub helpen?
Is er dan niemand die mij kan verder helpen?
Bumperdebump
- WHERE forum_berichten.datum > $gebruikers['registratiedatum'] ergens bij de SELECT van de forumberichten
-2e probleem: euh... kloppen gegevens in DB wel? kan zo even niks raars ontdekken aan query...
Voor de rest.. Beetje spelen, proberen, enzovoort.. Is de beste manier om t te leren :). dusz.
Succes!
Gewijzigd op 01/01/1970 01:00:00 door Johan
Je zal voor die gebruikersregistratiedatum bij elke subquery een extra join moeten doen naar je usertabel om daar de datum uit te halen (of zoals johan al aangaf, meegeven in de query zelf, is vast nog performanter!)
"JOIN forum_berichten ON (forum_topics.ID)" Ik geloof niet dat je ON hier klopt, want volgens mij is forum_berichten.ID en forum_topics.ID niet aan elkaar gelinkt, maar wel met forum_berichten.forum_topic_id...
Verder zie ik daar los in de query dingen als mysql_real_escape gedoe...
Als je met dergelijke query's gaat bezighouden is het wel sterk aangeraden om dit met prepared statements te gaan doen.
Ik heb meerdere dingen geprobeerd maar ik kom er gewoon niet uit.
Heb mijn leraar Database communicaties een email gestuurd en hij gaf mij ong. dit terug:
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
Select ID, titel, uitleg, status,
FROM forum_subcategorie FS
WHERE not exists
(
SELECT ID FROM forum.gelezen FG
WHERE FS.ID = FG.forum_topic_id AND FG.gebruiker_id = '". mysql_real_escape_string($gebruikers['ID']) ."' AND FG.datum >= DATE_ADD(NOW(), INTERVAL 2 MONTH)
)
AS ongelezen
Maar ok dit klopt niet want nu word er gekeken naar het topic datum en niet naar de laatste bericht datum.
Kan iemand mij verder helpen?
FROM forum_subcategorie FS
WHERE not exists
(
SELECT ID FROM forum.gelezen FG
WHERE FS.ID = FG.forum_topic_id AND FG.gebruiker_id = '". mysql_real_escape_string($gebruikers['ID']) ."' AND FG.datum >= DATE_ADD(NOW(), INTERVAL 2 MONTH)
)
AS ongelezen
Maar ok dit klopt niet want nu word er gekeken naar het topic datum en niet naar de laatste bericht datum.
Kan iemand mij verder helpen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT S.ID, S.titel, S.uitleg, S.status,
CASE WHEN NOT
EXISTS (
SELECT forum_topic_id
FROM forum_gelezen
WHERE forum_topic_id = T.ID
AND gebruiker_id = '3'
)
THEN 0
ELSE 1
END AS gelezen
FROM forum_subcategorie S, forum_topics T
WHERE T.forum_subcategorie_id = S.ID
AND T.datum > '". mysql_real_escape_string($gebruikers['registratiedatum']) ."'
AND S.forum_categorie_id = '". mysql_real_escape_string($line['ID']) ."'
CASE WHEN NOT
EXISTS (
SELECT forum_topic_id
FROM forum_gelezen
WHERE forum_topic_id = T.ID
AND gebruiker_id = '3'
)
THEN 0
ELSE 1
END AS gelezen
FROM forum_subcategorie S, forum_topics T
WHERE T.forum_subcategorie_id = S.ID
AND T.datum > '". mysql_real_escape_string($gebruikers['registratiedatum']) ."'
AND S.forum_categorie_id = '". mysql_real_escape_string($line['ID']) ."'
Alleen ik krijg alleen resultaten terug als er al topics in de subcategorie plaats vinden.
Overigens krijg ik nu per topic de resultaten terug en ik moet het per subcategorie
Hoe los ik dat op?
Gewijzigd op 01/01/1970 01:00:00 door Zero XT
2) topics groeperen met GROUP BY op subcategorie