MySQL选择最多出现或平均

时间:2013-01-12 02:27:23

标签: mysql

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

1)“最常出现”的值,如果有任何普遍存在的

2)或“平均”值,如果没有最大值。

示例表1:

value
1
2
3
4

所有值都是平等的,因此我想采用AVG(`value`)

示例表2:

value
1
2
2
3

2占优势,因此我想选择值2。

什么mysql查询会这样做?

2 个答案:

答案 0 :(得分:1)

从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进行测试以查看特定值占优势时的结果):http://sqlfiddle.com/#!2/76914/3

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

答案 1 :(得分:0)

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

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))

注意:如果你有top的关系,但也有其他值,那么返回一个任意值。在这种情况下,您没有指定要执行的操作。

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