MySQL,HAVING返回单个结果

时间:2018-03-10 01:46:36

标签: mysql sql mysql-workbench having

我面对一张看起来像这样的球员桌:

这里的表格形象:
image of table here

我试图让那些玩高于平均总播放时间的玩家回归,我尝试使用WHERE代替HAVING,但是我遇到了语法错误。我的代码只返回一个玩家,而不是所有玩家平均总游戏时间:

\DB::transaction(function () {
    \DB::unprepared("
        LOCK TABLES `users` WRITE;
        ALTER TABLE `users` DROP COLUMN tracking;
        UNLOCK TABLES;"
    );
}, 5);

为什么它只返回一个?这是HAVING的本质吗?

1 个答案:

答案 0 :(得分:1)

你想要的是这样的:

SELECT p.player_name, p.player_team, p.minutes_played 
FROM player p
HAVING p.minutes_played > (SELECT AVG(p2.minutes_played) FROM player p2);

您的查询发生了什么?好吧,首先我要注意问题是AVG(minutes_played)而不是HAVING子句本身。 MySQL有一个扩展,其中HAVING子句基本上被视为WHERE - 用于没有聚合的查询。

但是,您的查询有聚合。它在AVG()子句中有HAVING。这会将查询转换为聚合查询,因为没有GROUP BY,查询只返回一行(不包括HAVING)。

这引出了一行中的值是什么的问题。好吧,返回来自任意不确定行的列。这也是一个MySQL扩展。

您编写的查询不是标准SQL,但由于有两个扩展,它在MySQL中被接受。执行此操作时,查询是一个没有GROUP BY的聚合查询,因此查询返回一行(如果不满足HAVING条件,则返回零行。)