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_identifier và store_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 BYmệnh đề; - được sử dụng với
GROUP BYtổng hợp các chức năng trongSELECTmệnh đề; - phụ thuộc vào chức năng của các cột được sử dụng trong
GROUP BYmệ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").