DISTINCT fonctionne sur toutes les colonnes du SELECT, donc si vous sélectionnez tout, il renverra chaque ligne distincte et pas seulement les publications distinctes. Pour contourner ce problème, vous pouvez simplement SÉLECTIONNER les données de la table des publications, puis les DISTINCT, c'est-à-dire
SELECT DISTINCT posts.*
Mais vous avez également dit que vous aimeriez les informations sur les messages et les chats si possible. Une façon de le faire et de conserver une ligne par message est d'utiliser GROUP_CONCAT votre requête pourrait donc aboutir à quelque chose comme ça.
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
J'ai apporté quelques autres modifications à votre requête d'origine, comme changer la première jointure en INNER JOIN et ajouter les filtres cats/tags aux conditions JOIN pour les tables concernées.
ps lorsque vous dites que vous avez des tables séparées pour les chats et les balises pour accélérer la génération de listes, vous pouvez constater qu'une table correctement indexée serait tout aussi rapide et simplifierait également votre code.