我有这个SQL查询,用于根据他们的'点'获取我的数据库中团队的排名。
SELECT id, points, team_name, FIND_IN_SET( points, (
SELECT GROUP_CONCAT( points
ORDER BY points DESC )
FROM teams )
) AS rank
FROM teams
WHERE id = ?
LIMIT 1
我遇到的问题是,考虑到两支球队拥有相同分数的情况,例如:说有两支球队,每支球队都有'0'分。该查询返回两个团队的排名“1”。
我希望拥有较低'id'的球队在拥有相同积分的球队之间拥有更高的排名。
例如,说team1和team2都有'5'分。我希望ID较低的团队排名第一。
如何更改我的查询呢?
由于
答案 0 :(得分:0)
您使用的方法在MySQL中的适用性有限,因为它取决于group_concat()
中的中间子字符串的长度。但是,您可以为此目的进行修改:
SELECT id, points, team_name,
FIND_IN_SET(CONCAT(points, ':', id),
(SELECT GROUP_CONCAT(points, ':', id ORDER BY points DESC, id )
FROM teams
)
) AS rank
FROM teams
WHERE id = ?
LIMIT 1;
更好的方法是:
select id, points, team_name,
(select count(*)
from teams t2
where t2.points > t.points or
(t2.points = t.points and t2.id <= t.id)
) as rank
from teams t
where id = ?;