web-dev-qa-db-fra.com

MySQL: colonne temporaire d'incrémentation automatique dans l'instruction select

Comment créer et incrémenter automatiquement une colonne temporaire dans mon instruction select avec MySQL?

Voici ce que j'ai jusqu'à présent:

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

Qui retourne:

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

Mais, j'ai besoin:

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

Cela vous donnera un numéro de ligne consécutif avec 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 ;

Résultat

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

Essaye ça:

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

Dans les versions modernes de MySQL, vous pouvez utiliser la fenêtre MySQL: http://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-function/

Exemple:

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

Et si vous avez un group by dans l'instruction select? le décompte sera arrêté.

Pour de tels cas, la seule solution que j'ai trouvée est l'imbrication, sélectionnez:

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