mySQL提取项目的顺序是按row_number进行的,包括连接的位置

问题描述

我有2个表: usuario 用户)(id,电子邮件,活动,id_rol)和 usuario_puntos (users_points)(id,id_usuario,points) 我需要按用户的点数获取其中rol = 3和active = 1订单的用户列表。

这是我的查询,用于检索所有用户,按职位排序

SELECT @row_number:=CASE 
        WHEN 
            @puntos <> puntos THEN @row_number + 1 
        ELSE 
            @row_number END AS posicion,@puntos:=puntos puntos,id_usuario,email,id_rol
        FROM usuario_puntos as up 
        inner join usuario as u on up.id_usuario=u.id,(SELECT @puntos:=0,@row_number:=0) AS t 
    ORDER BY puntos DESC

这是回应

response fot the first query

当我添加其中u.id_rol = 3且active = 1时 查询如下:

SELECT @row_number:=CASE 
        WHEN 
            @puntos <> puntos THEN @row_number + 1 
        ELSE 
            @row_number END AS posicion,@row_number:=0) AS t 
    where u.id_rol=3 and active=1
    ORDER BY puntos DESC

响应的位置不正确

enter image description here

我不知道在何处添加内容,以使其有效! 任何想法?谢谢!

更新 表格目前如何 乌苏里奥:

ID    Email         Active       id_rol
1     [email protected]   true         3
2     [email protected]   false        3
3     [email protected]   true         3
4     [email protected]   true         2

Usuario_puntos:

id    id_usuario    puntos    Some Other Stuffs...
1     1             100       xxxx
2     2             50        yyyy
4     3             200       zzzz

解决方法

如果您正在运行MySQL 8.0,则使用窗口函数可以轻松得多。 dense_rank()可以满足您的需求:

select 
    dense_rank() over(order by up.puntos desc) posicion,up.id_usuario,u.email,u.id_rol
from usuario u
inner join usuario_puntos up on up.id_usuario = u.id
where  u.id_rol = 3 and u.active=1

您的查询使每个用户看起来都usuario_puntos中有一行,但是这种假设可能是错误的。如果是这样,您可能需要一个聚合查询:

    select 
    dense_rank() over(order by up.puntos desc) posicion,u.id_rol
from usuario u
inner join (
    select id_usuario,sum(puntos) puntos
    from usuario_puntos 
    group by id_usuario
) up on up.id_usuario = u.id
where  u.id_rol = 3 and u.active=1