首页 > 解决方案 > 在新的行排序中获取值的位置

问题描述

我正在使用 100 组对我的数据进行分页LIMIT。所以在下面的查询中,我们有按文件名排序的王子歌曲的第 5 页:

SELECT Song_Title, Artist_Name, `Record_Company`, Filename
FROM songs 
WHERE songs.Filename != ''  AND Artist_Name LIKE '%Prince%' 
ORDER BY songs.Filename ASC LIMIT 400, 100

我需要做的是在给定查询顺序的情况下找到行的位置。

因此,在下面的示例中,Prince 的争议位于第 2 位,因为它是按文件名排序的。但是,如果我按 Song_Title 对其进行排序,它将位于位置 1。我将能够将此值用作枢轴,因此如果显示由不同的列重新排序,则用户可以保持已选择的值显示。

这是对该查询的尝试:

SELECT Song_Title, Artist_Name, `Record_Company`, Filename, **ROW_NUMBER**
FROM songs 
WHERE songs.Filename != ''  AND Artist_Name = 'Prince' AND Song_Title = 'Controversy'
ORDER BY songs.Filename ASC 

这是表格布局的示例:

+-----------+------------+----------------+--------+
|Song_Title | Artist_Name|`Record_Company`|Filename|
+-----------+------------+----------------+--------+
|   Kiss    | Prince     |   WARNER       | a      |
+-----------+------------+----------------+--------+
|Controversy| Prince     |   WARNER       | b      |
+-----------+------------+----------------+--------+
|  Cream    | Prince     |   WARNER       | c      |
+-----------+------------+----------------+--------+

显然,我可以通过查询每一行并仅在内存中找到位置来做到这一点,但考虑到我返回了多少行,这不是一个可行的选择。这在 SQL 中可能吗?

编辑:

我想看到的输出只是所选值的行或行号。我会用它来知道我应该设置我的限制的页面。

编辑2:

mysql版本:5.6

标签: mysqlsql

解决方案


您可以尝试在 mysql 中给出行号:-

  SET @row_number = 0;
  SELECT  (@row_number:=@row_number + 1) AS Slno, Song_Title, Artist_Name, `Record_Company`, Filename
  FROM songs 
  WHERE songs.Filename != ''  AND Artist_Name LIKE '%Prince%'  AND Artist_Name = 'Prince' 
  ORDER BY songs.Filename ASC LIMIT 400, 100

如果你想根据组分配行号,那么你可以试试这个:

  SET @row_number = 0;
  SET @groupnumber = 0
  SELECT  @row_number:=CASE
    WHEN @groupnumber = groupnumber THEN @row_number + 1
    ELSE 1
  END AS num,
  @groupnumber :=groupnumber as groupnumber ,
  Song_Title, Artist_Name, `Record_Company`, Filename
  FROM songs, (SELECT @groupnumber :=0,@row_number:=0) as t 
  WHERE songs.Filename != ''  AND Artist_Name LIKE '%Prince%' 
  ORDER BY songs.Filename ASC LIMIT 400, 100

推荐阅读