mysql的各种组由在一个查询

  • 本文关键字:一个 查询 mysql mysql
  • 更新时间 :
  • 英文 :


我想获得我的数据集的统计数据,

例如,这是我的数据集:
FirstName LastName Country  City    BirthMonth
Donald    Trump    England  London  Jan
Bill      Gates    England  London  Sep
Donald    Suther   England  York    Sep
Donald    Suther   Germany  Berlin  Jan

这是我的'group_by'列表:

[['FirstName', 'LastName'], ['Country', 'City'], ['BirthMonth']]

我想要得到以下统计数据:

group by FirstName &姓:

FirstName LastName Count
Donald    Trump    1    
Donald    Suther   2    
Bill      Gates    1

按国家&城市:

Country City    Count
England London  2
England York    1
Germany Berlin  1

group by BirthMonth:

BirthMonth Count 
Jan        2    
Sep        2      

我的查询看起来像这样:

select FirstName, LastName, Country, City, BirthMonth
from my_table
where <some conditions to filter rows only from certain timestamp>

现在我有两个选项:

将所有值返回到服务器并在那里进行处理(我使用python) -此查询包含许多行并导致开销

b。查询多次,每次按特定字段分组

select FirstName, LastName, count(*) as group_by
from my_table
where ...
group by FirstName, LastName

c。是否有第三种选择,即只有一个查询,并返回所有不同的"group_by"?

和另一个问题:
从(a)和(b)哪个更好?
我要注意到组by有有限的选项-例如'FirstName'只有20个选项,这意味着(b)将每次结果小于20*(组by在查询行的数量)<40,但是(a)将产生20^5行,这是大量的数据

为了简化,我假设每次在group_by中不超过2列,(这实际上是目前的情况,它可能在未来增长,但目前我可以使用一个解决方案,考虑到这一点)

您可以使用UNION将每个分组查询与其他查询组合起来。

NULL填充每个子查询中未使用的列。
SELECT FirstName, LastName, NULL AS Country, NULL AS City, NULL AS BirthMonth, COUNT(*) AS count
FROM my_table
GROUP BY FirstName, LastName
UNION ALL
SELECT NULL, NULL, Country, City, NULL, COUNT(*)
FROM my_table
GROUP BY Country, City
UNION ALL
SELECT NULL, NULL, NULL, NULL, BirthMonth, COUNT(*)
FROM my_table
GROUP BY BirthMonth

最新更新