DISTINCT SELECT में सभी कॉलम पर काम करता है, इसलिए क्या आप सब कुछ चुन रहे हैं, यह प्रत्येक अलग पंक्ति को लौटाएगा, न कि केवल अलग-अलग पोस्ट। इसे पूरा करने के लिए आप केवल पोस्ट टेबल से डेटा का चयन कर सकते हैं और फिर इसे DISTINCT कर सकते हैं, यानी
SELECT DISTINCT posts.*
लेकिन आपने यह भी कहा है कि यदि संभव हो तो आप पोस्ट और बिल्लियों की जानकारी भी चाहेंगे। ऐसा करने और प्रति पोस्ट एक पंक्ति रखने का एक तरीका 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
मैंने आपकी मूल क्वेरी में कुछ अन्य बदलाव किए हैं, जैसे पहले शामिल को INNER JOIN में बदलना और संबंधित तालिकाओं के लिए JOIN शर्तों में कैट/टैग फ़िल्टर जोड़ना।
ps जब आप कहते हैं कि आपके पास सूची बनाने में तेजी लाने के लिए बिल्लियों और टैग के लिए अलग-अलग टेबल हैं, तो आप पाएंगे कि सही ढंग से अनुक्रमित एक तालिका उतनी ही तेज़ होगी और आपके कोड को सरल भी करेगी।