sql - 为什么这个查询返回第一行而不是黄牌最多的名字和国家
问题描述
我有一个足球队的数据库。
我的查询如下所示:
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));
但它只返回第一行玩家的姓名和国家,而不是黄牌最多的玩家的信息。
为什么会这样?我应该如何解决它?
解决方案
您想要的子查询是:
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
条款有两个目的。它使查询成为只返回一行的聚合查询。它验证列的最大值不是0
或NULL
。
推荐阅读
- c - 对于 10 个整数的数组,表达式 arr 和 &arr 是否相同?
- python - virtualenvwrapper mkvirtualenv 不工作但没有错误
- asp.net-mvc - 我应该怎么做才能将 datepicker 应用于此代码?
- python - 对数彩条?
- json - 在 Postman 中测试时出现三重嵌套 JSON 对象的语法错误
- php - 防止通过 AJAX 调用直接访问文件
- macos - 如何修复架构 x86_64 的错误未定义符号
- python - 用于列表或子列表中的项目
- c# - 如何检查浏览器对图像和视频的兼容性/支持?
- powerbi - PowerBI:在不使用 Azure 流分析的情况下创建实时报告