我正在尝试从分组查询中获取行位置。
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 位,依此类推。
一个更好的例子:
最佳答案
评论太长了。示例 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/