【问题标题】:How to add ROW INDEX as a column to SQL SELECT query?如何将 ROW INDEX 作为列添加到 SQL SELECT 查询?
【发布时间】:2012-11-13 02:20:33
【问题描述】:

假设我有这样的 SQL 查询:

SELECT id, name, index(not a real column) FROM users ORDER BY rating DESC

我想在选定的列中添加代表记录索引的列。

例子:

 id    name  rating
 1     a     4
 2     b     2
 3     c     8
 4     d     5

我想得到这张桌子:

 id    name  rating  index
 3     c     8       1
 4     d     5       2
 1     a     4       3
 2     b     2       4

【问题讨论】:

  • 所以你想要结果表中的行号?
  • 您简要描述您的要求的句子中是否缺少某些内容? “将列添加到选定的列......” NVM 我明白了你的意思。您需要结果表的行索引号。
  • 记录的索引是什么?
  • 是的。 (显然你不能回答是或否,因为这个文本区域上的字符最少)

标签: mysql sql


【解决方案1】:

尝试以下方法获取 row_index:

set @row_num = 0; 
SELECT id,name,rating, @row_num := @row_num + 1 as row_index FROM users
ORDER BY rating desc;

【讨论】:

  • 它有效,但似乎没有优雅的解决方案。
  • Yarin 的优雅程度如何? :) 我也想知道你所说的“这个文本区域上的最少字符”是什么意思......
  • 我在寻找类似 INDEX() 函数的东西。至于“最低限度”的事情,它与添加 cmets 时在 textarea 上的 Stackoverflow 验证有关:P
  • 好一个。 :D 关于“最低限度注意”。顺便说一句,在 MySQL 中使用 INDEX() 来满足您所需的上下文......也许在未来的计划中;)如果你找到了,我也很感兴趣。
  • MySQL 不支持 analytic/"windowing"/OLAP 类型的函数,所以这很优雅!在 Oracle 或 MS SQL-Server 中,您可以编写: select id, name, rating, row_number () over (partition by id order by rating desc) "index" from users order by rating desc
【解决方案2】:

类似的东西 set @cnt=0; select *, @cnt:=@cnt+1 from users order by rating desc;

应该完成这项工作(不过,您需要在每次查询之前设置 @cnt)

【讨论】:

    【解决方案3】:

    @bonCodigo 的答案在您尝试使用 php 管理员或 sql 代码时是正确的。 但是如果你想在php中调用一个查询,你应该声明如下:

    $sql_query = "SELECT (@row_number:=@row_number + 1) AS 'row_index', id, name, rating FROM (SELECT @row_number:=0) AS temp, users"
    
    $this->db->query ( $sql_query )->result ();
    

    (这段代码是针对 Code igniter 框架的)

    更新:

    但是,当JOIN 一起使用时,它将不起作用。在这种情况下,你需要像往常一样读取数据,然后自己添加一个列索引,你可以从这段代码中得到一个思路:

    $list = $this->db->query ( $sql_query )->result ();
    
    for($i = 0; $i < count($list); $i++ ){
        $list[$i]->no = $i + 1;
    }
    

    (这段代码是针对 Code igniter 框架的)

    【讨论】:

      【解决方案4】:

      它现在内置在 MySQL 8.0 和 MariaDB 10.2 中:

      SELECT
        id, name, rating,
        ROW_NUMBER(ORDER BY rating DESC) AS index
      FROM users ORDER BY rating DESC
      

      【讨论】:

        【解决方案5】:

        如果您没有要排序的列,您仍然可以使用ROW_NUMBER()

        SELECT 
          id, name, rating,
          ROW_NUMBER(ORDER BY (select 1)) AS index
        FROM users 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-24
          相关资源
          最近更新 更多