Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在大型mysql表中查找出现次数最多且彼此不同的值的有效方法_Mysql_Sql_Count_Greatest N Per Group - Fatal编程技术网

在大型mysql表中查找出现次数最多且彼此不同的值的有效方法

在大型mysql表中查找出现次数最多且彼此不同的值的有效方法,mysql,sql,count,greatest-n-per-group,Mysql,Sql,Count,Greatest N Per Group,我有一个mysql表,大约有6100万行。我对这个问题感兴趣的两个栏目是“foo_类型”和“foo_id”。我想做的是,对于“foo_type”的每个不同值,返回出现次数最多的foo_id 因此,我的结果如下所示: foo_type | foo_id ------------------- Banana | 127321 Apple | 59871 etc 等等,意思是“当foo_类型为‘Apple’时,foo_id 59871出现的次数比foo_id的任何其他值都多。”

我有一个mysql表,大约有6100万行。我对这个问题感兴趣的两个栏目是“foo_类型”和“foo_id”。我想做的是,对于“foo_type”的每个不同值,返回出现次数最多的foo_id

因此,我的结果如下所示:

foo_type  |  foo_id
-------------------
Banana    |  127321
Apple     |  59871
etc
等等,意思是“当foo_类型为‘Apple’时,foo_id 59871出现的次数比foo_id的任何其他值都多。”

这两列都使用单个多列索引(仅包含这两列)进行索引

最有效的方法是什么?谢谢


编辑:如果有帮助的话,我提前知道foo_类型的所有可能值。

您描述的是一个称为模式的统计概念。有些数据库有一个内置的聚合函数(例如Oracle),但没有MySQL

您可以使用聚合和窗口函数解决此问题:

select *
from (
    select foo_type, foo_id, count(*) cnt, 
        rank() over(partition by foo_type order by count(*) desc) rn
    from mytable 
) t
where rn = 1
这需要MySQL 8.0。在早期版本中:

select foo_type, foo_id, count(*) cnt
from mytable t
group by foo_type, foo_id
having count(*) = (
    select count(*)
    from mytable t1
    where t1.foo_type = t.foo_type
    group by t1.foo_id
    order by count(*) desc limit 1
)

请看@草莓安MCRE在这种情况下是很困难的,因为它都是关于如何处理一个非常大的数据集。我可以给出一个100行的样本,但是效率的问题是无关紧要的。只有当表的大小非常大时,这个问题的正确答案和错误答案之间的区别才会真正适用。这个社区中有许多人足够聪明,能够自然地提供最有效的解决方案(受基数、索引等限制)谢谢-我在我的本地版本上运行了它,大约是生产版本的1/200大小(就本表中的行而言),15分钟后它仍在运行。我希望有一个更快的方法…@MaxWilliams。对于一个有200万行(甚至6000万行)的表,这两个查询都不应该花费15分钟。其他原因可能会减慢您的系统。