Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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 - Fatal编程技术网

MySQL选择最常发生或平均值

MySQL选择最常发生或平均值,mysql,Mysql,我有一个MySQL表,我想从中选择: 1) “最常发生”值(如果存在任何普遍值) 2) 或“平均”值,如果没有最常出现的值 示例表1: value 1 2 3 4 所有的值都是相等的,因此我想取AVG(`value`) 示例表2: value 1 2 2 3 值2占优势,因此我想选择值2 什么样的mysql查询可以做到这一点?以下方法计算这两个值,然后在它们之间进行选择: select (case when numcnts = 1 then avgvalue else topvalue en

我有一个MySQL表,我想从中选择:

1) “最常发生”值(如果存在任何普遍值)

2) 或“平均”值,如果没有最常出现的值

示例表1:

value
1
2
3
4
所有的值都是相等的,因此我想取
AVG(`value`)

示例表2:

value
1
2
2
3
2
占优势,因此我想选择值2


什么样的mysql查询可以做到这一点?

以下方法计算这两个值,然后在它们之间进行选择:

select (case when numcnts = 1 then avgvalue else topvalue end)
from (select avg(value)  as avgvalue from t) cross join
     (select value  as topvalue from t group by value order by count(*) desc limit 1) cross join
     (select count(distinct cnt) as numcnts from (select count(*) as cnt from t group by value))
注意:如果顶部有领带,但也有其他值,则返回任意值。在这种情况下,您没有指定要执行的操作


此外,SQL未经测试,因此可能存在语法错误。

以下方法计算这两个值,然后在其中进行选择:

select (case when numcnts = 1 then avgvalue else topvalue end)
from (select avg(value)  as avgvalue from t) cross join
     (select value  as topvalue from t group by value order by count(*) desc limit 1) cross join
     (select count(distinct cnt) as numcnts from (select count(*) as cnt from t group by value))
注意:如果顶部有领带,但也有其他值,则返回任意值。在这种情况下,您没有指定要执行的操作


此外,SQL未经测试,因此可能存在语法错误。

从Gordon的答案开始,我在SQL Fiddle中测试并更正了SQL查询:

SELECT IF(t4.numcnts = 1, t1.avgvalue, t2.topvalue) AS result 
 FROM (select avg(value) as avgvalue from test) t1 
 CROSS JOIN (select value as topvalue from test group by value order by count(*) desc limit 1) t2 
 CROSS JOIN join (select count(distinct cnt) as numcnts from 
    (select count(*) as cnt from test group by value) t3) t4
这里是两个测试表的摆弄(切换test2进行测试,以便在特定值占优势时查看结果):


我的更改是在
SELECT
子句中使用
IF
而不是
CASE
语句,并为子选择添加必要的表别名。

从Gordon的答案开始,我在SQL Fiddle中测试并更正了SQL查询:

SELECT IF(t4.numcnts = 1, t1.avgvalue, t2.topvalue) AS result 
 FROM (select avg(value) as avgvalue from test) t1 
 CROSS JOIN (select value as topvalue from test group by value order by count(*) desc limit 1) t2 
 CROSS JOIN join (select count(distinct cnt) as numcnts from 
    (select count(*) as cnt from test group by value) t3) t4
这里是两个测试表的摆弄(切换test2进行测试,以便在特定值占优势时查看结果):


我的更改是在
SELECT
子句中使用
IF
而不是
CASE
语句,并为子选择添加必要的表别名。

我无法这样做。我可以用PHP来做,我知道它背后的想法。选择计数(
value
),按
value
I获取计数分组。如果最大计数为1,则选择平均值,否则选择最大值。我不太了解MySQL语法,无法将其作为一个查询来编写。我无法做到这一点。我可以用PHP来做,我知道它背后的想法。选择计数(
value
),按
value
I获取计数分组。如果最大计数为1,则选择平均值,否则选择最大值。我不太了解MySQL语法,无法将其作为1个查询来编写。