提问者:小点点

HAVING子句的意外行为


我在MySQL中有下表-

runs overs
 5     6
 6     7

我试图测试having子句而不使用group by子句的行为。

When i write-
select * from cricket having runs=MIN(runs);
OUTPUT-
runs overs
 5     6

select * from cricket having runs=MAX(runs);
OUTPUT-
Empty Set

这种行为背后的原因是什么?

编辑:在颠倒行顺序时-

runs overs
 6     7
 5     6

输出如下-

select * from cricket having runs=MIN(runs);
OUTPUT-
Empty Set

select * from cricket having runs=MAX(runs);
OUTPUT-
runs overs
 6     7

共1个答案

匿名用户

您使用select,聚合函数和having子句的方式不正确。

您可能使用的是mysql版本最近的5.7,所以这种行为是允许的,但结果是不可预测的。 (对于mysql版本>5.6,通过defualt这种查询会产生错误)

使用聚合函数,具有和选择列的preoper方法基于

在group by子句中提及聚合函数中未涉及的列

所以您的第一个查询应该是

select * 
    from cricket 
    having runs = ( 
        select min(runs) from cricket
    )

select c.* 
from cricket c
inner join  (
    select overs, min(runs) min_runs
    from cricket 
    group by  overs
    order by min_runs desc limit 1
) t on t.overs = c.overs 
    and t.min_runs = c.runs