1

我有一个要从中选择的 MySQL 表:

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

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

示例表 1:

value
1
2
3
4

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

示例表 2:

value
1
2
2
3

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

什么mysql查询会这样做?

4

2 回答 2

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并为子选择添加必要的表别名。

于 2013-01-12T03:05:43.990 回答
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))

注意:如果顶部有平局,但也有其他值,则返回任意值。在这种情况下,您没有指定要做什么。

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

于 2013-01-12T02:46:34.183 回答