2013-04-10 8 views
26

Wie erstelle ich eine temporäre Spalte in meinem Select-Anweisung mit MySQL und automatisch inkrementieren? HierMySQL: Auto inkrement temporäre Spalte in Select-Anweisung

ist das, was ich bisher:

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

Welche zurück:

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

Aber ich brauche:

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

'1, 2, 2, 4' .. Erklären Sie, wo 3- – Kermit

+1

verschwindet @FreshPrinceOfSO irgendwo nach der Präposition – swasheck

+0

Sorry, Typo ! Das soll ein 3. – Sg1456

Antwort

47

Dies gibt Ihnen eine fortlaufende Zeilennummer mit 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 ; 

Ergebnis

| ROWNUMBER | ROWID | 
--------------------- 
|   1 |  1 | 
|   2 | 25 | 
|   3 | 33 | 
|   4 | 150 |
+0

Entschuldigung, aber wofür ist die b? Ich erhalte immer noch einen Fehler bei dieser Zeile. – Sg1456

+1

'b' ist der Alias ​​der" Dummy "-Tabelle. Probieren Sie den bearbeiteten Code aus. –

+0

Es funktioniert! Vielen Dank! – Sg1456

15

Try this:

SET @rownr=0; 
SELECT @rownr:[email protected]+1 AS rowNumber, rowID 
    FROM myTable 
    WHERE CategoryID = 1 
11

Aber was, wenn Sie eine group by in der select-Anweisung haben? Das Zählen wird ausgeschaltet sein.

Für solche Fälle ist die einzige Lösung, die ich gefunden nistet wählen:

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 
+1

Sie sind Legende! Ich habe die gesamte SO für diesen speziellen Fall durchsucht, aber es wurde keine Lösung gefunden, bis ich auf diese Antwort stieß! – AlphaMale

+0

Danke für das Teilen genau das, was ich gesucht habe. – w5m