DISTINCT virker på alle kolonner i SELECT, så har du VÆLG alt, vil det returnere hver enkelt række og ikke kun de forskellige indlæg. For at komme uden om dette kan du bare VÆLGE dataene fra posttabellen og derefter DISTINCERE dem, dvs.
SELECT DISTINCT posts.*
Men du har også sagt, at du gerne vil have indlæggene og katteoplysningerne, hvis det er muligt. En måde at gøre dette på og beholde en række pr. indlæg er at bruge GROUP_CONCAT så din forespørgsel kan ende med noget som dette.
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
Jeg har foretaget et par andre ændringer af din oprindelige forespørgsel, som f.eks. at ændre den første joinforbindelse til en INNER JOIN og tilføje katte-/tags-filtrene til JOIN-betingelserne for de relevante tabeller.
ps, når du siger, at du har separate tabeller til katte og tags for at fremskynde genereringen af lister, kan du finde ud af, at en tabel, der er korrekt indekseret, ville være lige så hurtig og også ville forenkle din kode.