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

Làm cách nào để GROUP BY DESC chọn thứ tự?

SELECT * FROM my_table GROUP BY section_identifier

là một SQL không hợp lệ truy vấn.

Cách làm GROUP BY hoạt động?

Hãy lấy truy vấn ở trên và xem cách GROUP BY làm. Đầu tiên, công cụ cơ sở dữ liệu chọn tất cả các hàng phù hợp với WHERE mệnh đề. Không có WHERE mệnh đề trong truy vấn này; điều này có nghĩa là tất cả các hàng của bảng được sử dụng để tạo tập hợp kết quả.

Sau đó, nó nhóm các hàng bằng cách sử dụng các biểu thức được chỉ định trong GROUP BY mệnh đề:

+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier    | store_id |
+----+--------------------+----------------------+----------+
| 17 | header             | header_option_one    |        1 |
| 23 | header             | header_option_three  |        0 |
+----+--------------------+----------------------+----------+
| 18 | footer             | footer_option_one    |        0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature   | homepage_feature_one |        0 |
| 25 | homepage_feature   | homepage_feature_one |        1 |
+----+--------------------+----------------------+----------+

Tôi đã đánh dấu các nhóm trong danh sách ở trên để làm rõ ràng mọi thứ.

Trên bước tiếp theo, từ mỗi nhóm, công cụ cơ sở dữ liệu tạo ra một hàng duy nhất . Nhưng bằng cách nào?

SELECT mệnh đề của truy vấn của bạn là SELECT * . * là viết tắt của danh sách đầy đủ các cột trong bảng; trong trường hợp này, SELECT * là một cách viết ngắn gọn:

SELECT id, section_identifier, option_identifier, store_id

Hãy phân tích các giá trị của cột id cho nhóm đầu tiên. Công cụ cơ sở dữ liệu nên chọn giá trị nào cho id ? 17 hoặc 23 ? Tại sao lại 17 và tại sao 23 ?

Nó không có bất kỳ tiêu chí nào để ưu tiên 17 trên 23 . Nó chỉ chọn một trong số chúng (có thể là 17 nhưng điều này phụ thuộc vào nhiều yếu tố bên trong) và đi một trong hai.

Không có vấn đề gì khi xác định giá trị cho section_identifier . Đây là cột được sử dụng để GROUP BY , tất cả các giá trị của nó trong một nhóm đều bằng nhau.

Tình trạng tiến thoái lưỡng nan lựa chọn lại xảy ra trên các cột option_identifierstore_id .

Theo SQL tiêu chuẩn truy vấn của bạn không hợp lệ và nó không thể được thực thi. Tuy nhiên, một số công cụ cơ sở dữ liệu chạy nó như được mô tả ở trên. Các giá trị cho các biểu thức không phải (ít nhất một trong các giá trị dưới đây):

  • được sử dụng trong GROUP BY mệnh đề;
  • được sử dụng với GROUP BY tổng hợp các chức năng trong SELECT mệnh đề;
  • phụ thuộc vào chức năng của các cột được sử dụng trong GROUP BY mệnh đề;

không xác định.

Kể từ phiên bản 5.7.5 , MySQL triển khai phát hiện phụ thuộc chức năng và theo mặc định, nó từ chối một GROUP BY không hợp lệ truy vấn như của bạn.

Cách làm cho nó hoạt động

Tôi không rõ bạn muốn lấy kết quả như thế nào. Dù sao, nếu bạn muốn lấy một số hàng từ bảng thì hãy GROUP BY không cách chính xác để làm điều đó. GROUP BY không chọn các hàng từ một bảng, nó tạo ra các giá trị mới bằng cách sử dụng các giá trị từ bảng. Một hàng được tạo bởi GROUP BY , hầu hết các trường hợp, không khớp với bất kỳ hàng nào từ bảng nguồn.

Bạn có thể tìm thấy giải pháp khả thi cho vấn đề của mình trong câu trả lời này . Bạn sẽ phải tự viết truy vấn sau khi bạn đọc và hiểu ý tưởng (và rất rõ ràng cho bạn cách chọn các hàng "chiến thắng").



  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:Cập nhật tất cả các hàng đặt trường thành 0, nhưng đặt trường của một hàng thành 1

  2. Sử dụng ngày trong ô Excel trong mệnh đề GIỮA trong truy vấn SQL

  3. Tại sao tôi nhận được id tài nguyên # 4 khi tôi áp dụng print_r () cho một mảng trong PHP?

  4. Bảng cơ sở dữ liệu không tồn tại theo trình biên dịch studio android

  5. # 1222 - Các câu lệnh SELECT đã sử dụng có một số cột khác nhau