PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

जॉइन के साथ UNNEST का उपयोग करना

तकनीकी रूप से, आपकी क्वेरी इस तरह काम कर सकती है (इस क्वेरी के उद्देश्य के बारे में पूरी तरह से निश्चित नहीं):

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 लोगों पर थोपना।
मैं बात कर रहा हूँ id स्तंभ नाम के रूप में। एक से अधिक टेबल वाले डेटाबेस में इस एंटी-पैटर्न का कभी भी उपयोग न करें। ठीक है, इसका मतलब मूल रूप से कोई भी . है डेटाबेस। जैसे ही आप तालिकाओं के समूह में शामिल होते हैं (यही आप करते हैं डेटाबेस में) आपके पास id . नामक कॉलम का एक गुच्छा होता है . पूरी तरह से व्यर्थ।
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() . पर जो आपकी क्वेरी में रास्ते में खो गया।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql - तालिका में प्रत्येक कॉलम की गणना (कोई शून्य मान नहीं)

  2. PostgreSQL में डेटा आयात करें और CSV को निर्यात करें

  3. PostgreSQL के लिए सर्वश्रेष्ठ अलर्ट और अधिसूचना उपकरण

  4. क्नेक्स चुपचाप पोस्टग्रेज टाइमस्टैम्प को टाइमज़ोन के साथ परिवर्तित करता है और गलत समय देता है

  5. पोस्टग्रेज में गतिशील एसक्यूएल क्वेरी