Jeg har løst det, takket være hjælp fra et fremragende blogindlæg her:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
Løsningen er ikke-triviel, kræver variabler og en vis avanceret viden om, hvordan mysql bestiller sine forespørgselsoperationer, men den ser ud til at være ret effektiv. En af nøglerne er, at variable tildelinger kan skjules i funktionskald!
I det væsentlige løser følgende forespørgsel problemet:
SET @num := 0, @type := '';
SELECT name, subgroup, @num AS increment
FROM table_name
WHERE 0 <= GREATEST(
@num := IF(@type = subgroup, @num + 1, 1),
LEAST(0, LENGTH(@type := subgroup)))
Funktionerne GREATEST
, LEAST
og LENGTH
er der bare som containere til variable opgaver. Som du kan se, gør disse funktioner i det væsentlige intet for at påvirke outputtet af forespørgslen.
Jeg fandt dog også ud af, at jeg havde "undergruppe"-værdier i min tabel, som ikke var fortløbende. For eksempel:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
Resulterede i en outputtabel som sådan:
+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1 | 1 |
| doe | 1 | 2 |
| jim | 1 | 3 |
| greg | 2 | 1 |
| boe | 2 | 2 |
| amos | 3 | 1 |
| ben | 1 | 1 |
| gary | 2 | 1 |
+------+----------+-----------+
Tager en ORDER BY
klausulen i slutningen af forespørgslen virkede ikke på grund af udførelsesrækkefølgen og skjulte variabeltildelinger i ORDER BY
klausulen kom tættere på, men havde sine egne problemer, så her er den sidste forespørgsel, som jeg brugte:
SET @num := 0, @type := '';
SELECT name, subgroup, @num AS increment
FROM (SELECT * FROM table_name ORDER BY subgroup) AS table_name2
WHERE 0 <= GREATEST(
@num := IF(@type = subgroup, @num + 1, 1),
LEAST(0, LENGTH(@type := subgroup)))
Resulterer i følgende output:
+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1 | 1 |
| doe | 1 | 2 |
| jim | 1 | 3 |
| ben | 1 | 4 |
| greg | 2 | 1 |
| boe | 2 | 2 |
| gary | 2 | 3 |
| amos | 3 | 1 |
+------+----------+-----------+
Yay!