2016-05-07 4 views
0

私は、データベース内のチームのランク番号を 'ポイント'に基づいて取得するためのSQLクエリを持っています。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 

私が抱えている問題は、2つのチームが同じポイントを持っているというシナリオが与えられていることです。 2つのチームがあり、各チームには「0」のポイントがあるとします。クエリは両方のチームのランク '1'を返します。

「id」が低いチームには、同じポイントのチーム間でランクを上げたいと思っています。

たとえば、team1とteam2の両方に「5」のポイントがあります。下位のIDを持つチームが1位になるようにします。

私のクエリを変更するにはどうすればよいですか?それはgroup_concat()における中間部分文字列の長さに依存するため

おかげ

答えて

0

は、使用している方法は、MySQLで限られた利用可能性を有します。ただし、この目的のためにそれを変更することができます。

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 = ?; 
+0

ありがとう! – iJamesPHP2

関連する問題