DISTINCT werkt op alle kolommen in de SELECT, dus als je alles SELECTEERt, wordt elke afzonderlijke rij geretourneerd en niet alleen de afzonderlijke berichten. Om dit te omzeilen, kunt u gewoon de gegevens uit de berichtentabel SELECTEREN en deze vervolgens ONDERSCHEIDEN, d.w.z.
SELECT DISTINCT posts.*
Maar je hebt ook gezegd dat je de berichten en katteninformatie zo goed mogelijk wilt hebben. Een manier om dit te doen en één rij per bericht te behouden, is door GROUP_CONCAT dus uw vraag kan ongeveer zo eindigen.
SELECT
posts.*,
GROUP_CONCAT(cats.id SEPARATOR ',') as catsList,
GROUP_CONCAT(tags.id SEPARATOR ',') as tagsList
FROM posts
INNER JOIN termRelations ON ( posts.id = termRelations.postId )
LEFT JOIN cats ON ( termRelations.termId = cats.id AND termRelations.termTypeId = 1 AND cats.id =5 )
LEFT JOIN tags ON ( termRelations.termId = tags.id AND termRelations.termTypeId = 0 AND
(tags.id =2
OR tags.id =1)
)
GROUP BY posts.id
LIMIT 0 , 30
Ik heb een aantal andere wijzigingen aangebracht in uw oorspronkelijke zoekopdracht, zoals het wijzigen van de eerste join in een INNER JOIN en het toevoegen van de filters voor katten/tags aan de JOIN-voorwaarden voor de relevante tabellen.
ps als je zegt dat je aparte tabellen hebt voor katten en tags om het genereren van lijsten te versnellen, zul je merken dat een tabel die correct is geïndexeerd net zo snel zou zijn en ook je code zou vereenvoudigen.