करने के लिए 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;