web-dev-qa-db-ja.com

MySQL:selectステートメントの一時列を自動インクリメント

MySQLを使用してselectステートメントで一時列を作成および自動インクリメントするにはどうすればよいですか?

ここに私がこれまでに持っているものがあります:

SET @cnt = 0;
SELECT
    (@cnt =@cnt + 1) AS rowNumber,
    rowID
FROM myTable
WHERE CategoryID = 1

返されるもの:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  (NULL)   |   1   +
+  (NULL)   |   25  +
+  (NULL)   |   33  +
+  (NULL)   |   150 +
+  (NULL)   |   219 +
+++++++++++++++++++++

しかし、私は必要です:

+++++++++++++++++++++
+ rowNumber | rowID +
+++++++++++++++++++++
+  1        |   1   +
+  2        |   25  +
+  3        |   33  +
+  4        |   150 +
+  ...      |   ... +
+++++++++++++++++++++
37
Sg1456

これにより、continue行番号3

SELECT
    (@cnt := @cnt + 1) AS rowNumber,
    t.rowID
FROM myTable AS t
  CROSS JOIN (SELECT @cnt := 0) AS dummy
WHERE t.CategoryID = 1
ORDER BY t.rowID ;

結果

| ROWNUMBER | ROWID | 
 --------------------- 
 | 1 | 1 | 
 | 2 | 25 | 
 | 3 | 33 | 
 | 4 | 150 |
77
Kermit

これを試して:

SET @rownr=0;
SELECT @rownr:=@rownr+1 AS rowNumber, rowID
  FROM myTable
  WHERE CategoryID = 1

MySQLの最新バージョンでは、MySQLウィンドウを使用できます。 http://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/

例:

SELECT  ROW_NUMBER() OVER (  ORDER BY productName  ) row_num, 
        productName, msrp 
FROM   products ORDER BY   productName;
22
Niels

しかし、group by select文で?カウントはオフになります。

そのような場合、私が見つけた唯一の解決策はネスト選択です:

SELECT (@cnt := @cnt + 1) AS rowNumber, t.*
from
(select
    t.rowID
FROM myTable 
WHERE CategoryID = 1
ORDER BY rowID) t
CROSS JOIN (SELECT @cnt := 0) AS dummy
19
Arrabi