47

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 +
+  ...      |   ... +
+++++++++++++++++++++
4

4 に答える 4

98

これにより、連続した行番号が得られます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 |
于 2013-04-10T15:50:41.127 に答える
31

しかし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
于 2014-03-16T05:14:28.600 に答える
29

これを試して:

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

最新バージョンの MySQL では、MySQL Window を使用できます: 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;
于 2013-04-10T15:48:15.647 に答える
1

このコードを使用できます。これはより簡単な解決策だと思います。

select ROW_NUMBER() OVER (  ORDER BY id  ) AS Seid, id from table1 where id<10

結果:

| | セイド | ID |

| | 1 | 5|

| | 2 | 7|

| | 3 | 8|

| | 4 | 9|

于 2021-03-25T16:26:00.373 に答える