为什么这个MySQL查询没有正确计算排名?

时间:2013-05-12 07:27:30

标签: mysql sql subquery

我正在尝试计算MySQL表的排名,按表colum排名,该列也包含NULL值。我找到了the snippet from this questions's answer,并根据我的用例对其进行了调整,但它不起作用 - @rownum := @rownum + 1 as rank似乎是order by在排序之前的计算机 order by

我的问题是:为什么会发生这种情况? global_average_rating_overall标准MySQL行为之前,是否正在执行变量增量?它与NULL有什么关系(它们不应该最后排序而不会影响其他任何东西吗?)。

现在,我已经用SELECT子句中的子查询解决了我的排名计算问题,但是我希望这个带变量的方法会更高效,因为没有涉及子查询,我也想要更好了解查询中的变量如何工作。


这是一个示例查询(注意:set @rownum := 0; select ID, post_title, m.meta_value as global_average_rating_overall, @rownum := @rownum + 1 as rank from wp_posts p left join wp_postmeta m on m.post_id = p.ID and m.meta_key = 'global_average_rating_overall' where p.post_status = 'publish' order by global_average_rating_overall desc; 也包含NULL - 这可能是导致奇怪行为的原因吗?):

ID  global_average_rating_overall  rank
--+------------------------------+-----
3   4                              14
9   3.9                            22
7   3.75                           11
...                                 1
...                                 2
...                                 3

结果如下:

global_average_rating_overall

(请注意{{1}}的排名与排名不匹配的最后排名

1 个答案:

答案 0 :(得分:0)

在查询执行期间读取和写入同一个变量是未定义的。如果排序由索引执行,则赋值可能与在临时表中执行排序的方式不同。