首页 > 解决方案 > 为什么这个查询返回第一行而不是黄牌最多的名字和国家

问题描述

我有一个足球队的数据库。

我的查询如下所示:

SELECT
    players.Name,
    players.Country
FROM
    players
WHERE
    players.Player_id = (SELECT player_cards.Player_id
                         FROM player_cards
                         HAVING MAX(player_cards.Yellow_Cards));

但它只返回第一行玩家的姓名和国家,而不是黄牌最多的玩家的信息。

为什么会这样?我应该如何解决它?

标签: sql

解决方案


您想要的子查询是:

players.Player_id = (SELECT pc.Player_id
                     FROM player_cards pc
                     ORDER BY pc.Yellow_Cards DESC
                     LIMIT 1
                    );

请注意,如果您有重复项,则仅返回一个最大值。

为什么你的不起作用?首先,它不是真正有效的 SQL,因为该HAVING子句使它成为一个聚合查询。. . 如果没有 a GROUP BY,则SELECT. 你有一个,所以我猜你使用的是旧版本的 MySQL。

查询有什么作用?MAX()由于inHAVING子句,它返回一行。一行具有任意Player_id-- 可能是“第一”行或任何行。值来自哪一行是未定义的。

HAVING条款有两个目的。它使查询成为只返回一行的聚合查询。它验证列的最大值不是0NULL


推荐阅读