DISTINCT funktioniert auf allen Spalten im SELECT, also wenn Sie alles SELECTen, wird es jede einzelne Zeile zurückgeben und nicht nur die einzelnen Posts. Um dies zu umgehen, könnten Sie einfach die Daten aus der Beitragstabelle AUSWÄHLEN und dann DISTINKTIEREN, d. H.
SELECT DISTINCT posts.*
Aber Sie haben auch gesagt, dass Sie nach Möglichkeit auch die Beiträge und Katzeninformationen möchten. Eine Möglichkeit, dies zu tun und eine Zeile pro Post beizubehalten, ist die Verwendung von GROUP_CONCAT Ihre Abfrage könnte also in etwa so enden.
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
Ich habe ein paar andere Änderungen an Ihrer ursprünglichen Abfrage vorgenommen, wie z. B. das Ändern des ersten Joins in einen INNER JOIN und das Hinzufügen der cats/tags-Filter zu den JOIN-Bedingungen für die relevanten Tabellen.
ps Wenn Sie sagen, dass Sie separate Tabellen für Katzen und Tags haben, um das Generieren von Listen zu beschleunigen, stellen Sie möglicherweise fest, dass eine korrekt indizierte Tabelle genauso schnell wäre und auch Ihren Code vereinfachen würde.