首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL行位置

MySQL行位置
EN

Stack Overflow用户
提问于 2013-12-02 17:11:57
回答 1查看 205关注 0票数 0

我正在尝试从分组查询中获取行位置。

代码语言:javascript
复制
SELECT x.id, x.position, x.name, x.total FROM (
    SELECT u.*, count(invites.user_id) as total, @rownum := @rownum + 1 AS position 
    FROM users u JOIN (SELECT @rownum := 0) r 
    LEFT JOIN invites i ON i.user_id = u.id AND i.status = 2 
    GROUP BY u.id 
    ORDER BY total DESC
) x
WHERE x.id = 2004

但我的军衔错了。行号没有正确计算行的位置。也许是关于加入和小组的事?

具有某些ids的表上的多个选择示例:

代码语言:javascript
复制
    id  total   position
    10  15  250
    158 13  124
    3   10  4
    (...)

这里的错误是id =3应该在第三位置,而不是在第四位置。而id = 10应该是第1位,而不是第250位,等等。

一个更好的例子:

木琴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-02 18:17:30

这太长了,不能发表评论。样本Fiddle中的问题是排序不稳定。总值为1的有多个值,这些值可以任意排序。而且,他们显然是。

您可以引入一个稳定的排序,方法是在排序中包含一个额外的列来唯一地标识每一行。对于SQL示例,查询如下:

代码语言:javascript
复制
SELECT `rank`
FROM (select @rownum:=@rownum+1 `rank`, p.names, count(p.names) as total 
      from TableName p, (SELECT @rownum:=0) r 
      group by names
      order by total, p.names DESC
    ) s
WHERE names = 'ship';

SELECT p.names, count(p.names) as total 
FROM TableName P
GROUP BY names
ORDER BY total desc, p.names;

编辑:

我明白问题所在了。使用额外的子查询层似乎解决了这个问题:

代码语言:javascript
复制
select n.*
from (SELECT @rownum:=@rownum+1 as `rank`, n.*
      FROM (select p.names, count(p.names) as total 
            from TableName p cross join (SELECT @rownum:=0) r 
            group by names
           ) n
      order by total desc, names
     ) n
where names = 'mango';

(SQL是这里。)

这是非常奇怪的行为,而且不明白。我想知道它是否与group by之后的隐式排序有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20333956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档