तकनीकी रूप से, आपकी क्वेरी इस तरह काम कर सकती है (इस क्वेरी के उद्देश्य के बारे में पूरी तरह से निश्चित नहीं):
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS tag_id
FROM mentions m
WHERE m.search_id = 3
AND 9 = ANY (m.taglist)
) m
JOIN tags t USING (tag_id) -- assumes tag.tag_id!
GROUP BY t.parent_id;
हालाँकि, ऐसा लगता है कि आप यहाँ गलत दिशा में जा रहे हैं। आम तौर पर कोई अनावश्यक सरणी को हटा देगा taglist
और सामान्यीकृत डेटाबेस स्कीमा रखें। तब आपकी मूल क्वेरी को अच्छी तरह से काम करना चाहिए, केवल उपनामों के साथ वाक्य रचना को छोटा करना चाहिए:
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM mentions m
JOIN taggings mt ON mt.mention_id = m.id
JOIN tags t ON t.id = mt.tag_id
WHERE 9 = ANY (m.taglist)
AND m.search_id = 3
GROUP BY t.parent_id;
रहस्य को सुलझाएं
<rant>
आपके "भिन्न परिणामों" का मूल कारण दुर्भाग्यपूर्ण नामकरण परंपरा है कि कुछ बौद्धिक रूप से चुनौती वाले ORM लोगों पर थोपना।
मैं बात कर रहा हूँ
स्तंभ नाम के रूप में। एक से अधिक टेबल वाले डेटाबेस में इस एंटी-पैटर्न का कभी भी उपयोग न करें। ठीक है, इसका मतलब मूल रूप से कोई भी . है डेटाबेस। जैसे ही आप तालिकाओं के समूह में शामिल होते हैं (यही आप करते हैं डेटाबेस में) आपके पास idid
. नामक कॉलम का एक गुच्छा होता है . पूरी तरह से व्यर्थ।tag
. नामक तालिका का आईडी कॉलम tag_id
होना चाहिए (जब तक कि कोई अन्य वर्णनात्मक नाम न हो)। कभी नहीं id
.</rant>
आपकी क्वेरी अनजाने में tags
की गणना करती है mentions
. के बजाय :
SELECT 25 AS keyword_id, count(m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS id
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t USING (id)
GROUP BY t.parent_id;
इसे इस तरह काम करना चाहिए:
SELECT 25 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id
FROM (
SELECT m.id, unnest(m.taglist) AS tag_id
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t ON t.id = m.tag_id
GROUP BY t.parent_id;
मैंने DISTINCT
को भी वापस जोड़ा है आपके count()
. पर जो आपकी क्वेरी में रास्ते में खो गया।