DISTINCT berfungsi pada semua kolom di SELECT, begitu juga Anda MEMILIH semuanya, itu akan mengembalikan setiap baris yang berbeda dan bukan hanya posting yang berbeda. Untuk menyiasatinya, Anda cukup PILIH data dari tabel posting dan kemudian BERBEDA, mis.
SELECT DISTINCT posts.*
Tetapi Anda juga mengatakan bahwa Anda akan menyukai pos dan info kucing juga jika memungkinkan. Salah satu cara untuk melakukan ini dan menyimpan satu baris per posting adalah dengan menggunakan GROUP_CONCAT jadi kueri Anda mungkin berakhir seperti ini.
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
Saya telah membuat beberapa perubahan lain pada kueri asli Anda seperti mengubah gabungan pertama menjadi INNER JOIN dan menambahkan filter cat/tags ke kondisi GABUNG untuk tabel yang relevan.
id ketika Anda mengatakan Anda memiliki tabel terpisah untuk kucing dan tag untuk mempercepat pembuatan daftar, Anda mungkin menemukan bahwa satu tabel yang diindeks dengan benar akan sama cepatnya dan juga akan menyederhanakan kode Anda.