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.