Ik wil een systeembreed 'ongelezen berichten systeem' ontwikkelen. Om makkelijk te beginnen ben ik met mijn forum begonnen en probeer ik meteen dit idee er in te verwerken. Iedere hit wordt vastgelegd in de database met userId, tijd en pagina (eigenlijk controller, action en id parameter voor het gemak). Aan de hand hiervan, icm de tabel met gegevens van berichten, moet ik kunnen berekenen hoeveel ongelezen berichten er zijn per topic nadat de gebruiker voor het laatste elk topic heeft bekeken. Natuurlijk probeer ik ook rekening te houden met het feit dat er geen record van een hit voor topics kan bestaan. Ik loop nu toch echt vast. Ik heb werkelijk geen idee hoe ik mijn query moet joinen om het gewenste resultaat te krijgen, dus heb ik het eerst geprobeerd met een subquery, maar helaas geeft die gewoon voor ieder returned record aan hoeveel berichten in de hele tabel forumMessages staat (21 op dit moment dus). Eerst zal ik m'n query maar eens posten, dan weten jullie misschien ook waar ik het over heb.
Sorry voor de onleesbaarheid, een deel komt nog van ZF ->__toString() af en heb ik zo in m'n client gepaste om te bewerken. Het aantal posts klopt omdat dat via een simpele left join gaat, maar het aantal newMessages is dus het totaal aantal records in forumMessages voor ieder record dat er uit komt. Voor de goede orde, ik probeer nu dus een topic overzicht voor een bepaalde categorie (id = 6) en het id van mijn account is 973, om dus de hits op te halen.
Deze query zou ik het liefst met een hele mooie join zien, maar als het niet anders kan dan een nested query vind ik het ook OK (is alleen wat minder mooi te programmeren met Zend_Db_Statement.. Ik krijg nu met deze nested query de error dat lastHit niet bestaat binnen de nested, terwijl je toch zou denken dat eerst de hoofd query wordt afgewerkt en daarna de sub pas ingevuld wordt. Door de bomen het bos... Ik dacht dat ik het wel een beetje kon ondertussen.
Bedankt.
MySQL:
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
| SELECT `forumTopics`.`id`, forumTopics.id as topicId, `forumTopics`.`userId`, `forumTopics`.`title`, `forumTopics`.`date`, `forumTopics`.`locked`, `forumTopics`.`deleted`, `forumTopics`.`flagged`, `forumTopics`.`information`, COUNT(forumMessages.id) AS `posts`, `users`.`name` AS `userName`, `users`.`group` AS `userGroup`, hits.date AS lastHit, IF (lastHit IS NULL, 1, (SELECT COUNT(forumMessages.id) FROM forumMessages WHERE ((forumMessages.date between lastHit and NOW()) OR lastHit IS NULL) AND forumMessages.topicId = topicId)) FROM `forumTopics` LEFT JOIN `users` ON users.id = forumTopics.userId LEFT JOIN `forumMessages` ON forumMessages.topicId = forumTopics.id LEFT JOIN hits ON hits.idParam = forumTopics.Id WHERE (forumMessages.topicId = forumTopics.id) AND (forumTopics.forumId = 6) AND ((hits.userId = 973 AND hits.controller = 'forum' AND hits.action = 'topic' AND hits.idParamType = 'id') OR hits.date IS NULL) GROUP BY `forumTopics`.`id`` |
Sorry voor de onleesbaarheid, een deel komt nog van ZF ->__toString() af en heb ik zo in m'n client gepaste om te bewerken. Het aantal posts klopt omdat dat via een simpele left join gaat, maar het aantal newMessages is dus het totaal aantal records in forumMessages voor ieder record dat er uit komt. Voor de goede orde, ik probeer nu dus een topic overzicht voor een bepaalde categorie (id = 6) en het id van mijn account is 973, om dus de hits op te halen.
Deze query zou ik het liefst met een hele mooie join zien, maar als het niet anders kan dan een nested query vind ik het ook OK (is alleen wat minder mooi te programmeren met Zend_Db_Statement.. Ik krijg nu met deze nested query de error dat lastHit niet bestaat binnen de nested, terwijl je toch zou denken dat eerst de hoofd query wordt afgewerkt en daarna de sub pas ingevuld wordt. Door de bomen het bos... Ik dacht dat ik het wel een beetje kon ondertussen.
Bedankt.