【问题标题】:mySQL fetch items order by row_number including a where an joinmySQL 按 row_number 获取项目顺序,包括 where 连接
【发布时间】:2020-12-07 00:34:34
【问题描述】:

我有 2 个表:usuario (users) (id,email,active,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, 
        @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 
    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 sql join where-clause window-functions


【解决方案1】:

如果您运行的是 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,
    up.id_usuario, 
    u.email, 
    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

【讨论】:

  • 感谢您的回复!我正在为 Windows 使用 MySQL。所以这是 MySQL 5.7 这个。
猜你喜欢
  • 2016-09-30
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多