0

user_id(INT)、ref_id(INT)、points(INT)、pointsgiven(BOOL/TINY_INT) の 1 つのテーブル データベースを (簡略化した形で) 持っています。

pointsgiven が true の場合、ポイントに基づいて指定した user_id の RANK を返すクエリが必要です。キッカーは、ネクタイが含まれている必要があります。次のクエリで必要に応じて、すべてのランクの結果セットを取得できます

SELECT 
user_id, ref_id, points, pointsgiven, 
CASE 
        WHEN @points = COALESCE(points, 0) THEN @rownum 
        ELSE @rownum := @rownum + 1 
END AS rank,
@points := COALESCE(points, 0)
FROM users CT
JOIN 
(
        SELECT @rownum := 0, @points := NULL
) r
WHERE pointsgiven=TRUE ORDER BY points DESC

したがって、それに基づいて、次のように特定の user_id を取得するためのサブクエリとして使用できると考えました。

select * from 
(
    SELECT 
    user_id, ref_id, points, pointsgiven, 
    CASE 
            WHEN @points = COALESCE(points, 0) THEN @rownum 
            ELSE @rownum := @rownum + 1 
    END AS rank,
    @points := COALESCE(points, 0)
    FROM users CT
    JOIN 
    (
            SELECT @rownum := 0, @points := NULL
    ) r
    WHERE pointsgiven=TRUE ORDER BY points DESC
) as derived WHERE user_id = 15

しかし、これは正しい user_id のランクとして [BLOB - 1 B] を返します。ここで何が間違っていますか?

4

1 に答える 1

1

クエリが機能しない理由がわかりません。ただし、単一のユーザー ID の場合は、相関サブクエリを使用できます。

select user_id, ref_id, points, pointsgiven,
       coalesce((select count(distinct user_id)
                 from users u2
                 where u2.pointsgiven=TRUE and
                       u2.points > u.points
                ) + 1, 1) as rank
from users u
where user_id = 15;

クエリでインデックスをusers(pointsgiven, points, user_id)使用する必要があります。

ランキングを 1 つだけ見ると、これはあなたの方法よりも速いかもしれません。

于 2013-07-30T00:26:50.703 に答える