たとえば、次のテーブルがあるとします。
CREATE TABLE place (
place_id serial primary key
, place text
, cat_id int);
sqlfiddle でセットアップをテストします。
セットアップで示したようなインデックスから利益を得ることができcategory
ます。
基本的に、次の 2 つの方法があります。
WITH x AS (
SELECT *, row_number() OVER (PARTITION BY category) AS rn
FROM place
WHERE category IN (1,2,3,4)
)
SELECT place_id, place, category
FROM x
ORDER BY rn
LIMIT 100;
- かなり洗練されていることに加えて、このクエリがカテゴリが増えると長くなる唯一の部分は
IN
句です。
- それぞれのシェアを計算する必要はありません
category
。これは自動的に行われます。
- カテゴリの行数がそのシェアよりも少ない場合、残りの行は他のカテゴリと同じ割合で埋められます。
(SELECT * FROM place WHERE category = 1 LIMIT 25)
UNION ALL
(SELECT * FROM place WHERE category = 2 LIMIT 25)
UNION ALL
(SELECT * FROM place WHERE category = 3 LIMIT 25)
UNION ALL
(SELECT * FROM place WHERE category = 4 LIMIT 25);
- これは原始的で非常に高速ですが、多くのカテゴリでは長くなります (遅くはありません)。
UNION ALL
ではなく、使用してくださいUNION
。
UNION
適用するには、クエリの各レッグを括弧で囲む必要がありますLIMIT
。
- 各カテゴリのシェアを計算し、端数シェアを分割する方法を決定する必要があります。
- カテゴリの行数がそのシェアよりも少ない場合、クエリから得られる行数は少なくなります。