Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để các nhóm con có một cột gia tăng đã tạo được thêm vào trong một truy vấn sql?

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 , LEASTLENGTH 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!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL SubQuery - MySQL 3.23

  2. Sự cố với cài đặt Ruby on Rails - Làm thế nào để sử dụng cài đặt WAMP MySQL?

  3. Toán tử này <=> trong MySQL là gì?

  4. Biến MySQL `max_allowed_packet` tự động đặt lại thành 1MB

  5. Đổi tên các cột trong câu lệnh chọn MySQL với R gói RJDBC