Forum subcategorie gelezen of niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Zero XT

Zero XT

30/08/2009 12:34:00
Quote Anchor link
(uitgeklede) tabellen:

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
 
PHP hulp

PHP hulp

18/05/2024 12:03:50
 
Zero XT

Zero XT

31/08/2009 00:32:00
Quote Anchor link
iemand?
 
Hipska BE

Hipska BE

31/08/2009 01:56:00
Quote Anchor link
Dus wat moet je allemaal berekenen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;


Zou een true of false moeten leveren
 
Zero XT

Zero XT

31/08/2009 10:40:00
Quote Anchor link
Hartelijk bedankt voor je antwoord Hipska(!) maar er zijn nog een paar problemen:

Dit zijn de uitgeklede tables:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Ik voer eerst een query uit om de forum_categorie op te halen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$result
= $database -> query("SELECT ID, titel, gast, gebruiker, vip, moderator FROM forum_categorie ORDER BY positie");

if($result !== false)
{

    foreach($result as $line_c)
    {

        //Hier ga ik de forum_subcategorieen ophalen met de daarbij horende icoontjes (gelezen of ongelezen)
    }
}

?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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



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
 
Zero XT

Zero XT

31/08/2009 19:03:00
Quote Anchor link
Sorry dat ik deze topic bump binnen 1 dag maar dit is een urgent iets wat snel af moet dus ik hoop dat de moderators voor deze ene keer dit door de vingers kunnen zien.

Kan iemand mij aub helpen?
 
Zero XT

Zero XT

01/09/2009 18:16:00
Quote Anchor link
Is er dan niemand die mij kan verder helpen?
 
Zero XT

Zero XT

02/09/2009 17:59:00
Quote Anchor link
Bumperdebump
 
Johan

Johan

02/09/2009 19:01:00
Quote Anchor link
Iets met...

- 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
 
Hipska BE

Hipska BE

03/09/2009 16:30:00
Quote Anchor link
"Wanneer er geen record in forum_gelezen staat geeft $line['ongelezen'] niets terug" Logisch, kijk hiervoor even welk soort join je precies moet toepassen (INNER, LEFT of RIGHT)

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.
 
Zero XT

Zero XT

06/09/2009 18:08:00
Quote Anchor link
Dankjewel.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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?
 
Zero XT

Zero XT

07/09/2009 18:55:00
Quote Anchor link
Ik heb nu een query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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']) ."'


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
 
Hipska BE

Hipska BE

07/09/2009 22:57:00
Quote Anchor link
1) Ik zie nergens een JOIN terwijl je dit wel verwacht van de DB

2) topics groeperen met GROUP BY op subcategorie
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.