Hey,

Mijn forum bevat delen (categorieën) die alleen voor VIP leden en / of crewleden beschikbaar zijn. Tijdens het doorzoeken van het forum moet ik dus controleren of diegene die zoekt toegang heeft tot bepaalde topics.

Mijn database opzet is als volgt:

- forum_cats
- forum_subcats
- forum_topics
- forum_posts

(ik heb categorieën en subcategorieën apart gehouden, ik weet dat het anders kan, maar dat kan ik nu helaas niet meer 1 2 3 veranderen)

Bij het doorzoeken wordt zowel forum_topics als forum_posts doorzocht op titel, bericht, gebruikersnaam, etc.

Nu moet er dus gecontroleerd worden of de gevonden topics zich in legitieme categorieën bevinden (lees: categorieën waar de gebruiker toegang tot heeft).

Nu kan ik dit in een heel ingewikkelde query gieten, zoiets als:


SELECT  
                    MAX(forum_posts.id) AS postid, 
                 
                    DATE_FORMAT(MAX(forum_posts.datum), '%d-%m-%Y om %H:%i uur') AS postdatum, 
                    UNIX_TIMESTAMP(MAX(forum_posts.datum)) AS postdatumunix, 
                     
                    MAX(forum_topics.id) AS topicid, 
                    MAX(forum_topics.titel) AS topictitel, 
                    MAX(forum_topics.sticky) AS topicsticky, 
                    MAX(forum_topics.gesloten) AS topicgesloten, 
                     
                    ((SELECT COUNT(*) FROM forum_posts WHERE topicid = MAX(forum_topics.id)) - 1) AS reactieaantal, 
                     
                    MAX(leden.id) AS topicstarterid, 
                    MAX(leden.gebruikersnaam) AS topicstartergebruikersnaam 

                FROM  
                    forum_posts 
                INNER JOIN 
                    forum_topics 
                ON 
                    forum_topics.id = forum_posts.topicid 
                INNER JOIN 
                    forum_subcats 
                ON 
                    forum_subcats.id = forum_topics.subcat 
                INNER JOIN 
                    forum_cats 
                ON 
                    forum_cats.id = forum_subcats.cat 
                LEFT JOIN 
                    leden 
                ON 
                    leden.id = forum_topics.starter 
                LEFT JOIN 
                    leden AS ledenposter 
                ON 
                    ledenposter.id = forum_posts.lidid 
                WHERE  
                    ledenposter.gebruikersnaam = 'keyword' 
                AND 
                    forum_cats.id IN (1,2,3,4,5,6,7,8,9,10,11,18,19) 
                GROUP BY 
                    forum_posts.topicid


Bovenstaande query is zo traag als ... (5 joins lijkt mij ook niet echt geschikt), dus dit is geen optie (dit is ook maar een (hele slechte) opzet).

Hebben jullie ideeën hoe ik deze bewerking gemakkelijk kan uitvoeren? Ik had zelf in gedachte om eerst "normaal" te zoeken door alle topics en posts met een (simpele) query en met php de topics er uit filteren. Echter is dit ook zeer omslachtig, aangezien je dan met een foreach loop door alle resultaten moet wandelen en de betreffende topics uit de array filteren.

Reageren