UNION
へ 3つのクエリすべての結果の行を選択し、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
ではないということです。 3つの基本クエリすべてに存在します。したがって、JOIN
に注意してください 行が完全に失われることはなく、追加してもNULL
にはなりません。 。
UNION ALL
を使用する 、UNION
ではありません 。同一の行を削除するのではなく、それらを追加する必要があります。
x
テーブルエイリアスであり、AS x
の省略形です。 。サブクエリには名前が必要です。ここでは他の名前にすることができます。
SOL機能FULL OUTER JOIN
MySQLには実装されていないため(前回チェックしたとき)、UNION
を使用する必要があります 。 FULL OUTER JOIN
行を失うことなく、3つの基本クエリすべてを結合します。
フォローアップの質問への回答
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;