Do UNION
výsledné řádky všech tří dotazů a poté vyberte 5 řádků s nejvyšší amount
:
(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
zachovat duplikáty.
Chcete-li přidat počty pro každý 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;
Záludná část je v tom, že ne každý event_id
bude přítomen ve všech třech základních dotazech. Dbejte tedy na to, aby JOIN
neztrácí řádky úplně a přidané položky se nezobrazují jako NULL
.
Použijte UNION ALL
, nikoli UNION
. Nechcete odstraňovat stejné řádky, chcete je sečíst.
x
je alias tabulky a zkratka pro AS x
. Je vyžadováno, aby měl poddotaz název. Zde může být jakékoli jiné jméno.
Funkce SOL FULL OUTER JOIN
není implementováno v MySQL (naposledy jsem to kontroloval), takže si musíte vystačit s UNION
. FULL OUTER JOIN
spojí všechny tři základní dotazy bez ztráty řádků.
Odpovězte na doplňující otázku
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;
Nebo chcete-li použít základní počty více způsoby:
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;