我有一个MySQL表,我想从中选择:
1)“最常出现”的值,如果有任何普遍存在的
2)或“平均”值,如果没有最大值。
示例表1:
value
1
2
3
4
所有值都是平等的,因此我想采用AVG(`value`)
示例表2:
value
1
2
2
3
值2
占优势,因此我想选择值2。
什么mysql查询会这样做?
答案 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未经测试,因此可能存在语法错误。