Rozwiązałem go dzięki pomocy z najdoskonalszego wpisu na blogu tutaj:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
Rozwiązanie nie jest trywialne, wymaga zmiennych i pewnej zaawansowanej wiedzy o tym, jak mysql porządkuje operacje zapytań, ale wydaje się być dość wydajne. Jednym z kluczy jest to, że przypisania zmiennych mogą być ukryte w wywołaniach funkcji!
Zasadniczo, następujące zapytanie rozwiązuje problem:
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)))
Funkcje GREATEST
, LEAST
i LENGTH
są tylko pojemnikami na zmienne zadania. Jak widać, te funkcje zasadniczo nie wpływają na wynik zapytania.
Jednak odkryłem również, że w mojej tabeli mam wartości „podgrup”, które nie są kolejne. Na przykład:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
Wynikiem jest tabela wyjściowa, taka jak:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Zatwierdzanie ORDER BY
klauzula na końcu zapytania nie działała ze względu na kolejność wykonywania i ukrywanie przypisań zmiennych w ORDER BY
klauzula była bliższa, ale miała swoje własne problemy, więc oto ostatnie zapytanie, którego użyłem:
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)))
Daje to następujące dane wyjściowe:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Hurra!