例如,我有一个简单的表books
:
| 作者|书|
| - ------|- ------|
| 作者-A|手册-A1|
| 作者-A|手册-A2|
| 作者B|手册-B1|
| 作者C|书本-C1|
| 作者C|书本-C2|
我需要计算每个作者的书,所以我会写:
select author, count(*) from books
group by author
# Author-A = 2
# Author-B = 1
# Author-C = 2
但现在我需要按作者群体来数书:
groupA = ['Author-A', 'Author-C'],
groupB = ['Author-B']
select authorGroup, count(*) from books
group by {
case author in groupA -> 'groupA'
case author in groupB -> 'groupB'
} as authorGroup
# ['Author-A', 'Author-C'] = 4
# ['Author-B'] = 1
这些组可以是不同的,并且来自另一个模块。编写此请求的最佳方式是什么?可能没有联合,例如:
select author as 'groupA', count(*) from books
where author in { groupA }
union
select author as 'groupB', count(*) from books
where author in { groupB }
因为可能会有很多团体提出请求(约20-30)
问题是,这些群体可能是绝对动态的:我可以在一个请求中作为一个组请求['Author-A', 'Author-B']
,在另一个组中请求['Author-B', 'Author-C']
。
例如,一个群体不像作者的国家或流派,它可以是完全动态的。
2条答案
按热度按时间l7wslrjt1#
通常的方法是将
JOIN
Map到Map表,如果需要的话,Map表可以是内嵌视图 (尽管我推荐使用实际的表,它可以被索引)。使用
CASE
表达式也可以获得类似的结果,但它的伸缩性不是很好...jc3wubiy2#
首先,您需要创建一个新表,显示作者所在的组。
以后你就数数
就像这样: