如果order by,则用户定义的存储排名变量会给出错误的值

时间:2017-06-01 12:30:19

标签: mysql sql

mysql table: work
|id|user_id|created_at|realization|

我一直在研究一个SQL查询,它可以计算性能(今天实现/在一月的第一天实现),并根据性能对记录进行排序。

  

预期结果:

|ranking|performance|user|
|1|0.88|36|
|2|0.712444111|444|
|3|0.711|1|
|4|0.33333|9|
|5|0.1006|29|
  

返回结果:

|ranking|performance|user|
|4|0.88|36|
|2|0.712444111|444|
|5|0.711|1|
|3|0.33333|9|
|1|0.1006|29|
  

这是我的问题:

SET @ranking := 0;
SELECT 
    @ranking := @ranking + 1 as ranking,
    w1.user_id,
    IFNULL(ROUND(w2.realization / w1.realization), 4), 0) AS performance
FROM work w1
    JOIN (
        SELECT min(created_at) AS first_month, max(created_at) AS last_month, user_id
        FROM work
        WHERE (DATE_FOMAT(NOW(), '%Y-%m') = DATE_FORMAT(created_at, '%Y-%m')
        GROUP BY user_id
        ORDER BY user_id
    ) AS w ON w1.user_id = w.user_id AND w1.created_at = w.first_month
JOIN work AS w2 ON w1.user_id = w2.user_id AND w2.created_at = w.last_month
ORDER BY performance DESC

更新

即使我试图以这种方式包装,排名也不正确

SET @ranking := 0;
SELECT @ranking := @ranking + 1 as ranking, a.user_id, a.performance
FROM (
    SELECT
        w1.user_id,
        IFNULL(ROUND(w2.realization / w1.realization), 4), 0) AS performance
    FROM work w1
        JOIN (
            SELECT min(created_at) AS first_month, max(created_at) AS     last_month, user_id
            FROM work
            WHERE (DATE_FOMAT(NOW(), '%Y-%m') = DATE_FORMAT(created_at, '%Y-    %m')
            GROUP BY user_id
            ORDER BY user_id
        ) AS w ON w1.user_id = w.user_id AND w1.created_at = w.first_month
    JOIN work AS w2 ON w1.user_id = w2.user_id AND w2.created_at =     w.last_month
    ORDER BY performance DESC
) AS a

0 个答案:

没有答案