त्रुटि संदेश आपको बताता है:
<ब्लॉकक्वॉट>WHERE क्लॉज में समुच्चय की अनुमति नहीं है
count()
एक समग्र कार्य है। उसके लिए HAVING क्लॉज का उपयोग करें।
क्वेरी इस तरह दिख सकती है:
SELECT r.*
FROM recommendations r
JOIN approvals a ON a.recommendation_id = r.id
WHERE r.user_id = $current_user_id
GROUP BY r.id
HAVING count(a.recommendation_id) = 1
PostgreSQL 9.1 या बाद के संस्करण के साथ यह GROUP BY
. के लिए पर्याप्त है प्राथमिक कुंजी एक तालिका के (recommendations.id
. मानते हुए) है पीके)। 9.1 से पहले के पोस्टग्रेज संस्करणों में आपको सभी . को शामिल करना था SELECT
. के कॉलम सूची जो GROUP BY
. में एकत्रित नहीं हैं सूची। recommendations.*
SELECT
. में सूची, वह तालिका का हर एक स्तंभ होगा।
मैं पोस्टग्रेएसक्यूएल 9.1 के रिलीज नोट्स उद्धृत करता हूं:
<ब्लॉकक्वॉट>
गैर-GROUP BY
. को अनुमति दें जब प्राथमिक कुंजी GROUP BY
. में निर्दिष्ट की जाती है, तो क्वेरी लक्ष्य सूची में कॉलम क्लॉज (पीटर एसेंट्रौट)
उप-चयन के साथ आसान
किसी भी तरह से, यह सरल और तेज़ है, वही कर रहा है:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
पंक्तियों को JOIN
से गुणा करने से बचें एक प्राथमिकता है, तो आपको उन्हें वापस एकत्रित करने की आवश्यकता नहीं है।