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 BY
mệnh đề; - được sử dụng với
GROUP BY
tổng hợp các chức năng trongSELECT
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").