我有一个要从中选择的 MySQL 表:
1) 任一“最常出现”的值,如果有任何普遍存在的话
2)或“平均值”值,如果没有最常出现的值。
示例表 1:
value
1
2
3
4
所有值都是平等发生的,因此我想采取AVG(`value`)
示例表 2:
value
1
2
2
3
值2
占优势,因此我想选择值 2。
什么mysql查询会这样做?
我有一个要从中选择的 MySQL 表:
1) 任一“最常出现”的值,如果有任何普遍存在的话
2)或“平均值”值,如果没有最常出现的值。
示例表 1:
value
1
2
3
4
所有值都是平等发生的,因此我想采取AVG(`value`)
示例表 2:
value
1
2
2
3
值2
占优势,因此我想选择值 2。
什么mysql查询会这样做?
从 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
并为子选择添加必要的表别名。
以下方法计算这两个值,然后在它们之间进行选择:
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 未经测试,因此可能存在语法错误。