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

これは、MySQL8.0およびMariaDB10.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

@bonCodigoの答えは、phpadminまたは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フレームワーク用です)

于 2018-06-12T04:13:33.977 に答える
0

注文する列がない場合でも、次を使用できますROW_NUMBER()

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