我在我们的API中使用Tastypie,一个端点需要显示特定类别中的地点列表。 这部分很简单:
class PlaceResource(ModelResource):
class Meta:
queryset = Place.objects.all()
filtering = {
'category': ALL
}
但是我说我有一个limit = 100
,我想从每个类别中获得偶数个位置。
示例:
/ API /地点/类别= 1和;类别= 2及类别= 3及类别= 4
应该从每个类别1,2,3和4给我25个位置。
我知道我可以使用SQL来做到这一点,但是如何以最佳方式完成?
答案 0 :(得分:1)
说,我们有一张桌子:
CREATE TABLE place (
place_id serial primary key
, place text
, cat_id int);
Test setup on sqlfiddle。
您可以从category
上的索引中获益,如设置中所示。
基本上,我看到两种不同的方式:
row_number()
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
的份额。UNION ALL
(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
。