SQL(mysql)排序表并获取其在排序表中的位置的行?

Posted

技术标签:

【中文标题】SQL(mysql)排序表并获取其在排序表中的位置的行?【英文标题】:SQL (mysql) sort table and get row with its position in the sorted table? 【发布时间】:2014-05-04 21:05:35 【问题描述】:

基本上我有这张桌子:

表 QID、UID、系统、添加(unix 时间戳)、错误

我试图做的是通过 UID 选择一行,但在此之前按“添加”对表进行排序,使其按时间戳 DESC 顺序排列,然后获取单行及其在排序表中的位置。

我目前有这个可以对行进行排名,但是我如何从中获得单行:

SET @rank=0;
SELECT @rank := @rank +1 AS rank, UID
FROM table
GROUP BY UID
ORDER BY added DESC

【问题讨论】:

您能否提供带有预期结果集的示例数据集? 【参考方案1】:

您可以按照以下方式进行操作:

SELECT COUNT(*)+1 AS rank FROM table
WHERE added < (SELECT added FROM table WHERE UID=123)

或者这样:

SELECT * FROM (
    SELECT @rank := @rank+1 AS rank, UID
    FROM table
    GROUP BY UID
    ORDER BY added ASC
) tmp WHERE UID=123

【讨论】:

第一个在初始条目检查后工作​​正常。【参考方案2】:

您将使用子查询:

SELECT *
FROM (SELECT @rank := @rank +1 AS rank, UID, added
      FROM (SELECT UID, added
            FROM t cross join
                   (SELECT @rank := 0) var
            GROUP BY UID
            ORDER BY added ASC
           ) t
     ) t
WHERE UID = 12346;

一个问题是,当给定的UID 有多行时,added 是不确定的。我怀疑你想要MAX(added)

【讨论】:

我得到了这个数据i.imgur.com/xEGS740.png 并尝试使用它,但它总是以排名 1 返回。(使用 ASC 或 DESC) @TristanCunningham 。 . .我的错。在使用带有group by 的变量时,我忘记了 mysql 需要和额外的级别。这是一个小 SQL Fiddle:sqlfiddle.com/#!2/a5a47/10.

以上是关于SQL(mysql)排序表并获取其在排序表中的位置的行?的主要内容,如果未能解决你的问题,请参考以下文章

合并两个排序的链表

如何从T-SQL中的排序表中从第M行开始获取N行

sql按某个字段值顺序排序

剑指offer面试题17:合并两个排序的链表

从 Postcode DB 获取 lat/lng 并在 PHP/MYSQL 中按最近的顺序排序

MySQL实现SQL Server排名函数