在SQL中,如何获取特定列的最大值所在的行?

4

我有一个问题:

SELECT COUNT(*) as votes, a.member_id 
FROM ballots a
WHERE ballot_id = 1
GROUP BY a.member_id

这将会产生类似于以下的结果:
votes  member_id
1      paul
5      mike
3      noynoy
10     andy
2      noel

我希望能获取到"andy"这一行,因为他得到了最高的"votes"。
如何更改查询以实现此目的?
先行感谢您的帮助 :)
6个回答

5
你可以使用ORDER BY将其从高到低排列,然后使用DESC进行降序排列。然后LIMIT结果仅限于一行(即最高的)。
SELECT COUNT(*) as votes, a.member_id 
FROM ballots a
WHERE ballot_id = 1
GROUP BY a.member_id
ORDER BY votes DESC
LIMIT 1

2
SELECT COUNT(*) as votes, a.member_id 
FROM ballots a
WHERE ballot_id = 1
GROUP BY a.member_id
ORDER BY COUNT(*) DESC 
LIMIT 1

这不会为用户计算所有投票,也没有分组。 - Hogan
是的,我已经修复了它,以更准确地匹配他的查询。 - Scott Arrington

2
SELECT COUNT(*) as votes, a.member_id 
FROM ballots a 
WHERE ballot_id = 1 
GROUP BY a.member_id
ORDER BY votes DESC
LIMIT 1

3
TOP 是 MS SQL 中的关键字,使用 LIMIT 1 来表示查询结果只返回一条记录。 - Jimmy Shelter

1
SELECT COUNT(*) as votes, a.member_id 
FROM ballots a 
WHERE ballot_id = 1 
GROUP BY a.member_id
ORDER BY COUNT(*) DESC
LIMIT 1

1

如果最大值重复,使用COUNT()将无法选择所有行。我的建议是使用MAX()

SELECT *
FROM ballots a
WHERE votes = (SELECT max(votes) FROM ballots)

这是错误的 - 每个用户可以有多行投票。 - Hogan

1

使用专门的 view 来计算投票可能更容易

CREATE VIEW v_votes AS 
  SELECT member_id, ballot_id,  COUNT(*) AS votes FROM ballots GROUP BY member_id

然后使用 HAVING 子句

SELECT * FROM v_votes HAVING MAX(votes)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接