21

假设我有这样的 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
4

5 回答 5

24

尝试以下方法来获取 row_index:

set @row_num = 0; 
SELECT id,name,rating, @row_num := @row_num + 1 as row_index FROM users
ORDER BY rating desc;
于 2012-11-25T12:03:34.110 回答
1

就像是 set @cnt=0; select *, @cnt:=@cnt+1 from users order by rating desc;

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

于 2012-11-25T12:02:50.400 回答
1

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

SELECT
  id, name, rating,
  ROW_NUMBER(ORDER BY rating DESC) AS index
FROM users ORDER BY rating DESC
于 2019-12-02T08:19:03.283 回答
0

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

SELECT 
  id, name, rating,
  ROW_NUMBER(ORDER BY (select 1)) AS index
FROM users 
于 2019-12-17T11:00:44.800 回答
0

当您在 php admin 或 sql 代码中尝试时,@bonCodigo 的答案是正确的。但是如果你想在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 框架的)

于 2018-06-12T04:13:33.977 回答