2013-07-29 3 views
0

J'ai une base de données de 1 table avec (sous une forme simplifiée) les champs suivants: user_id (INT), ref_id (INT), points (INT), pointsgiven (BOOL/TINY_INT)ID de classement MySQL avec des liens basés sur des retours de colonne Erreur

Je veux une requête qui renvoie le RANK de l'id_utilisateur que je spécifie en fonction des points, étant donné que pointsgiven est vrai. Le botteur est, j'ai besoin de cravates incluses. Je peux obtenir un jeu de résultats pour tous les grades si je veux avec la requête suivante

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 

Ainsi, sur cette base, je pensais que je pouvais l'utiliser comme un sous-requête pour obtenir un certain user_id comme suit:

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 

Mais cela renvoie [BLOB - 1 B] comme le rang sur le bon id_utilisateur. Qu'est-ce que je fais mal ici?

+0

Y at-il une chance que vous utilisiez phpmyadmin pour vérifier cela? –

+0

Vous voudrez peut-être vérifier cette réponse fantastique concernant la détection des liens dans l'ordre de classement: http://stackoverflow.com/questions/8767323/how-best-to-get-someones-rank-from-a-scores-table-with -php-et-mysql-sans – hannebaumsaway

+0

.. Oui Derick, c'est là que je le teste. Pourquoi dites vous cela? Praguian, merci pour le lien! – AMB0027

Répondre

1

Je ne sais pas pourquoi votre requête ne fonctionne pas. Pour un seul ID utilisateur, cependant, vous pouvez utiliser une sous-requête en corrélation:

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; 

Un index sur users(pointsgiven, points, user_id) doit être utilisé par la requête.

Pour ne voir qu'un seul classement, cela peut même être plus rapide que votre méthode.

+0

Gordon. Merci pour votre réponse, il semble faire exactement ce que j'ai demandé. Cependant, bien qu'il ne classe pas les utilisateurs avec pointsgiven = FALSE, il les renvoie toujours dans l'ensemble. Je n'ai pas précisé si elles devraient ou ne devraient pas être retournées, mais c'est une solution simple néanmoins. Merci encore, et si vous voyez un problème avec mon édition avec une déclaration résolue, s'il vous plaît faites le moi savoir! – AMB0027

Questions connexes