Saya telah menyelesaikannya, terima kasih atas bantuan dari posting blog paling bagus di sini:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
Solusinya tidak sepele, membutuhkan variabel dan beberapa pengetahuan lanjutan tentang bagaimana mysql memerintahkan operasi kuerinya, tetapi tampaknya cukup berkinerja. Salah satu kuncinya adalah bahwa penetapan variabel dapat disembunyikan di dalam panggilan fungsi!
Pada dasarnya, kueri berikut memecahkan masalah:
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)))
Fungsi GREATEST
, LEAST
, dan LENGTH
hanya ada sebagai wadah untuk penugasan variabel. Seperti yang Anda lihat, fungsi-fungsi tersebut pada dasarnya tidak melakukan apa pun untuk memengaruhi output kueri.
Namun, saya juga menemukan bahwa saya memiliki nilai "subgrup" di tabel saya yang tidak berurutan. Misalnya:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
Menghasilkan tabel output seperti ini:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Menempel ORDER BY
klausa ke akhir kueri tidak berfungsi karena perintah eksekusi, dan menyembunyikan penetapan variabel di ORDER BY
klausa datang lebih dekat tetapi memiliki masalah sendiri, jadi inilah kueri terakhir yang saya gunakan:
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)))
Menghasilkan output berikut:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Ya!