DISTINCTはSELECTのすべての列で機能するため、すべてを選択すると、個別の投稿だけでなく、各個別の行が返されます。これを回避するには、postsテーブルからデータを選択し、それを区別します。つまり、
SELECT DISTINCT posts.*
しかし、可能であれば、投稿や猫の情報も必要だと言っています。これを行い、投稿ごとに1行を維持する1つの方法は、 GROUP_CONCAT そのため、クエリは次のようになる可能性があります。
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
最初の結合をINNERJOINに変更したり、関連するテーブルのJOIN条件にcats / tagsフィルターを追加したりするなど、元のクエリに他のいくつかの変更を加えました。
psリストの生成を高速化するために猫とタグ用に別々のテーブルがあると言うと、正しくインデックス付けされた1つのテーブルが同じくらい高速で、コードも単純化されることがあります。