MySQL:如何一次性查询表中各列最大值及对应用户名
一次性获取各列最大值及对应用户名的SQL方案
嘿,当然有办法用一条SQL一次性返回你要的结果!不用先查最大值再关联,咱们可以用UNION ALL把每个列的查询逻辑合并起来,直接输出结构化的结果,比你预期的还清晰。
适用的SQL语句
假设你的表名为user_scores(记得换成你实际的表名),可以这么写:
SELECT 'Vale' AS column_name, username, Vale AS max_value FROM user_scores WHERE Vale = (SELECT MAX(Vale) FROM user_scores WHERE Vale IS NOT NULL) UNION ALL SELECT 'Jorge' AS column_name, username, Jorge AS max_value FROM user_scores WHERE Jorge = (SELECT MAX(Jorge) FROM user_scores WHERE Jorge IS NOT NULL) UNION ALL SELECT 'Andrea' AS column_name, username, Andrea AS max_value FROM user_scores WHERE Andrea IS NOT NULL AND Andrea = (SELECT MAX(Andrea) FROM user_scores WHERE Andrea IS NOT NULL);
逻辑解释
- 每个
SELECT块单独处理一个数值列:先通过子查询找到该列忽略NULL后的最大值,再匹配出拥有这个最大值的用户名。 UNION ALL把三个列的结果合并成一个结果集,这样你就能一次性拿到所有列的信息。- 特意加上
column_name字段,能清楚区分每条结果对应哪个列,比你说的“John Jorge 6”这种无结构的输出更实用。
针对你的测试数据的输出结果
用你给的测试数据跑这条SQL,会得到:
| column_name | username | max_value |
|---|---|---|
| Vale | John | 2 |
| Jorge | John | 6 |
| Andrea | Marcy | 1 |
完美对应你要的“John Vale 2;John Jorge 6;Marcy Andrea 1”的需求~
另外,如果某列有多个用户同时拥有最大值(比如假设两个用户的Jorge值都是6),这条SQL会把所有对应的用户名都返回,这也是合理的业务逻辑。
内容的提问来源于stack exchange,提问作者noisy andrew
相关产品推荐
相关产品推荐

