php - MySQL 行位置

标签 php mysql sql database

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

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

但是我的排名出了问题。 rownum 没有正确计算行的位置。也许有关加入和分组的信息?

在表格上使用一些 id 进行多项选择的示例:

    id  total   position
    10  15  250
    158 13  124
    3   10  4
    (...)

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

一个更好的例子:

sqlfiddle

最佳答案

评论太长了。示例 Fiddle 中的问题是排序不稳定。总数为 1 的值有多个,并且这些值可以以任意方式排序。而且,他们显然是。

您可以通过在排序中包含附加列来唯一标识每一行来引入稳定排序。对于 SQL Fiddle 示例,查询将是:

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;

编辑:

我看到了问题。使用附加的子查询层似乎可以解决该问题:

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 Fiddle 是 here 。)

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

关于php - MySQL 行位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333956/

相关文章:

php - 一般错误 : 1366 Incorrect integer value Laravel

php - 如何从 URL 中解码 & 以便 header() 起作用(urldecode 不起作用)

php - codeigniter 中的 Home Controller 中未调用 user_validation 函数

php - 如何使用 php/mysql 为社交网站的 friend /关注者设置数据库

php - mysql select 语句中的 group by 无法正常工作

php - 多维数组迭代

sql - 按时间范围查询时的 Postgresql 性能问题

php - 复杂的数据库设置 : Trying to display two field values that correspond to three other specific fields

java - 无法解析的日期异常 Windows Azure 移动服务

php - 将负数变为 0 的默认 php 函数