MySQL 获取 ORDER BY 编号错误的行位置
Posted
技术标签:
【中文标题】MySQL 获取 ORDER BY 编号错误的行位置【英文标题】:MySQL get row position with ORDER BY incorrectly numbered 【发布时间】:2013-11-01 06:06:54 【问题描述】:我有以下 mysql 查询,我想给在计算字段上排序的行以及相应的行位置。我使用了来自here 的 OMG Ponies 代码作为模板,但返回的行编号不正确(它们在没有排序的情况下按键(gemid)顺序编号)。我知道这与 GROUP BY 上的 JOIN 有关,但我知道如何解决它。提前致谢。
SELECT g.gemid, sum_rating, @rownum := @rownum + 1 AS row_num FROM gems g
LEFT JOIN (SELECT gemid, SUM(rating) as sum_rating from gemrating GROUP BY gemid) rt ON g.gemid = rt.gemid
JOIN (SELECT @rownum := 0) Z
WHERE g.grade = '8'
ORDER BY sum_rating asc
输出应该看起来像:
gemid sum_rating row_num
------ ------------ ----------
2 10 1
4 25 2
1 40 3
3 41 4
相反,它又回来了:
gemid sum_rating row_num
------ ------------ ----------
2 10 2
4 25 4
1 40 1
3 41 3
【问题讨论】:
您的预期输出是什么?你到底想点什么? 对不起,如果我不清楚。输出按 sum_rating 顺序排序。 row_num 应该从 1 编号到按该顺序排序的任何值。相反,它以自然键顺序编号,因此将 row_num 显示为 4、5、1、6 等。我已更新帖子以显示更好。 【参考方案1】:看起来这行得通。我知道在给它们编号之前我必须先对记录进行排序,然后从有序列表中选择。
SELECT g2.gemid, g2.sum_rating, @rownum := @rownum + 1 AS row_num FROM
(SELECT g.gemid, rt.sum_rating, g.grade FROM gems g
LEFT JOIN (SELECT gemid, SUM(rating) as sum_rating from gemrating GROUP BY gemid) rt ON g.gemid = rt.gemid
WHERE g.grade = '8' ) g2
JOIN (SELECT @rownum := 0) Z
WHERE g2.grade = '8'
ORDER BY sum_rating asc
【讨论】:
以上是关于MySQL 获取 ORDER BY 编号错误的行位置的主要内容,如果未能解决你的问题,请参考以下文章