MySQL query to dynamic “Ranking rows”

后端 未结 2 576
后悔当初
后悔当初 2021-01-15 11:55

I\'m having problems running a query ranking. The inner SELECT gives the rows in order of ranking, for each line, the variable @rank increases, if not a position equal to th

相关标签:
2条回答
  • 2021-01-15 12:06

    First, Thank you all!

    I found a way to return the expected result making other selects 2

    A) Select first grouped and ordered

    SELECT
        SUM( a.value ) AS SUM_VALUES,
        b.id AS b_id,
        b.name AS b_name
    FROM
        a INNER JOIN b ON ( a.b_id = b.id )
    GROUP BY b.id
    ORDER BY SUM_VALUES DESC
    

    B) I do this ranking list

    SELECT
        R.*,
       @prev := @curr,
       @curr := R.SUM_VALUES,
       @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
    FROM (
            SELECT
                SUM( a.value ) AS SUM_VALUES,
                b.id AS b_id,
                b.name AS b_name
            FROM
                a INNER JOIN b ON ( a.b_id = b.id )
            GROUP BY b.id
            ORDER BY SUM_VALUES DESC
    ) AS R
    

    C) And lastly, just select what matters

    SELECT
        Ranking.b_id,
        Ranking.b_name,
        Ranking.rank
    FROM
    (
        SELECT
            R.*,
           @prev := @curr,
           @curr := R.SUM_VALUES,
           @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
        FROM (
                SELECT
                    SUM( a.value ) AS SUM_VALUES,
                    b.id AS b_id,
                    b.name AS b_name
                FROM
                    a INNER JOIN b ON ( a.b_id = b.id )
                GROUP BY b.id
                ORDER BY SUM_VALUES DESC
        ) AS R
    ) AS Ranking
    WHERE
        Ranking.b_id = 1
    

    The result of this query was:

    +------+--------+------+
    | b_id | b_name | rank |
    +------+--------+------+
    |    1 | AAA    |    2 |
    +------+--------+------+
    
    0 讨论(0)
  • 2021-01-15 12:20

    having
    It will be slow, but a having clause will run after all the selects, joins, where and group by's have finished and are fully resolved.
    The only problem is that having does not use an index, whilst where does use an index.

    SELECT
      ranking stuff
    FROM 
      lot of tables
    WHERE simple_condition
    HAVING filters_that_run_last
    

    Make your joins explicit
    Note that you don't have to mix explicit and implicit joins.
    If you want a cross join, you can use the cross join keyword.

        ....
        ) AS Ranking
        CROSS JOIN (SELECT @curr := null, @prev := null, @rank := 0) InitVars
    WHERE
      Ranking.regional_id = 1003
    
    0 讨论(0)
提交回复
热议问题