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

कुछ प्रश्नों के योग परिणाम और फिर SQL में शीर्ष 5 खोजें

करने के लिए UNION तीनों प्रश्नों की परिणामी पंक्तियाँ और फिर उच्चतम amount वाली 5 पंक्तियाँ चुनें :

(SELECT event_id, count(*) AS amount
FROM   pageview 
GROUP  BY event_id
ORDER  BY pageviews DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   upvote
GROUP  BY event_id
ORDER  BY upvotes DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   attending
GROUP  BY event_id
ORDER  BY attendants DESC, rand()
LIMIT  1000)

ORDER  BY 2 DESC
LIMIT  5;

मैनुअल:

UNION ALL डुप्लीकेट रखने के लिए।

हर event_id के लिए गिनती जोड़ने के लिए :

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) AS amount
    FROM   pageview 
    GROUP  BY event_id
    ORDER  BY pageviews DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   upvote
    GROUP  BY event_id
    ORDER  BY upvotes DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   attending
    GROUP  BY event_id
    ORDER  BY attendants DESC, rand()
    LIMIT  1000)
    ) x
GROUP  BY 1
ORDER  BY sum(amount) DESC
LIMIT  5;

यहां मुश्किल हिस्सा यह है कि हर event_id नहीं है सभी तीन आधार प्रश्नों में मौजूद होगा। तो ध्यान रखें कि एक JOIN पंक्तियों को पूरी तरह से नहीं खोता है और जोड़ नहीं निकलते NULL

UNION ALL का उपयोग करें , नहीं UNION . आप समान पंक्तियों को हटाना नहीं चाहते, आप उन्हें जोड़ना चाहते हैं।

x AS x . के लिए एक टेबल एलियास और शॉर्टहैंड है . एक सबक्वेरी के लिए एक नाम होना आवश्यक है। यहां कोई और नाम हो सकता है।

एसओएल फीचर FULL OUTER JOIN MySQL में लागू नहीं किया गया है (पिछली बार मैंने चेक किया था), इसलिए आपको UNION . के साथ करना होगा . FULL OUTER JOIN पंक्तियों को खोए बिना सभी तीन आधार प्रश्नों में शामिल हो जाएगा।

अनुवर्ती प्रश्न का उत्तर

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) / 100 AS amount
    FROM   pageview ... )
    
    UNION ALL
    (SELECT event_id, count(*) * 5 
    FROM   upvote ... )
    
    UNION ALL
    (SELECT event_id, count(*) * 10
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY  sum(amount) DESC
LIMIT  5;

या, कई तरीकों से आधार गणनाओं का उपयोग करने के लिए:

SELECT event_id
      ,sum(CASE source
              WHEN 'p' THEN amount / 100
              WHEN 'u' THEN amount * 5
              WHEN 'a' THEN amount * 10
              ELSE 0
           END)  AS total
FROM (
   (SELECT event_id, 'p'::text AS source, count(*) AS amount
    FROM   pageview ... )
    
    UNION ALL
    (SELECT event_id, 'u'::text, count(*)
    FROM   upvote ... )
    
    UNION ALL
    (SELECT event_id, 'a'::text, count(*)
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY 2 DESC
LIMIT  5;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. फॉर्म विकल्पों के साथ MYSQL क्वेरी को फ़िल्टर करें

  2. InnoDB:लॉक करने में असमर्थ ./ibdata1 त्रुटि:35

  3. MySQL:मैक पते को स्टोर करने का सबसे अच्छा तरीका?

  4. दूसरी चयन क्वेरी यदि पहले चयन 0 पंक्तियाँ लौटाता है

  5. पायथन में एडब्ल्यूएस लैम्ब्डा के साथ MySQL का उपयोग करने में समस्या