Vyřešil jsem to díky pomoci z nejlepšího blogového příspěvku zde:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
Řešení je netriviální, vyžaduje proměnné a určité pokročilé znalosti o tom, jak mysql objednává své operace dotazů, ale zdá se, že je poměrně výkonné. Jedním z klíčů je, že přiřazení proměnných lze skrýt ve volání funkcí!
Následující dotaz v podstatě řeší problém:
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)))
Funkce GREATEST
, LEAST
a LENGTH
jsou zde pouze jako kontejnery pro přiřazení proměnných. Jak vidíte, tyto funkce v podstatě neovlivňují výstup dotazu.
Zjistil jsem však také, že ve své tabulce mám hodnoty „podskupiny“, které nejsou po sobě jdoucí. Například:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
Výsledkem je výstupní tabulka takto:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Přizpůsobení ORDER BY
klauzule na konci dotazu nefungovala kvůli pořadí provedení a skrytí přiřazení proměnných v ORDER BY
klauzule se přiblížila, ale měla své vlastní problémy, takže zde je poslední dotaz, který jsem použil:
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)))
Výsledkem je následující výstup:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Hurá!