Tôi đã giải quyết được nó, nhờ sự trợ giúp từ một bài đăng trên blog tuyệt vời nhất ở đây: http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
Giải pháp không hề nhỏ, yêu cầu các biến và một số kiến thức nâng cao về cách mysql sắp xếp các hoạt động truy vấn của nó, nhưng nó có vẻ khá hiệu quả. Một trong những chìa khóa là có thể ẩn các phép gán biến trong các lệnh gọi hàm!
Về cơ bản, truy vấn sau giải quyết vấn đề:
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)))
Các chức năng GREATEST
, LEAST
và LENGTH
chỉ ở đó dưới dạng các vùng chứa cho các phép gán biến. Như bạn có thể thấy, những chức năng đó về cơ bản không làm gì ảnh hưởng đến kết quả đầu ra của truy vấn.
Tuy nhiên, tôi cũng nhận thấy rằng tôi có các giá trị "nhóm con" trong bảng của mình không liên tiếp. Ví dụ:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
Kết quả là một bảng đầu ra như sau:
+------+----------+-----------+
| 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 |
+------+----------+-----------+
Lấy một ORDER BY
mệnh đề ở cuối truy vấn không hoạt động do thứ tự thực thi và ẩn các phép gán biến trong ORDER BY
mệnh đề đã đến gần hơn nhưng có vấn đề riêng, vì vậy đây là truy vấn cuối cùng mà tôi đã sử dụng:
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)))
Dẫn đến kết quả sau:
+------+----------+-----------+
| 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!