如何解决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
这是回应
当我添加其中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
响应的位置不正确
我不知道在何处添加该内容,以使其有效! 任何想法?谢谢!
更新 表格目前如何 乌苏里奥:
ID Email Active id_rol
1 asd@asd.com true 3
2 qwe@asd.com false 3
3 zxc@asd.com true 3
4 asd@asd.com 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。