2017-01-27 28 views
5

AM sử dụng MySQL 5.7.13 trên cửa sổ máy tính của tôi với wamp serverdanh sách SELECT không có trong mệnh đề GROUP BY và chứa cột nonaggregated .... tương thích với sql_mode = only_full_group_by

Đây Vấn đề của tôi là khi thực hiện truy vấn này

SELECT * 
FROM `tbl_customer_pod_uploads` 
WHERE `load_id` = '78' AND 
     `status` = 'Active' 
GROUP BY `proof_type` 

Am nhận luôn báo lỗi như thế này

Biểu # 1 trong tổng số danh sách SELECT không có trong mệnh đề GROUP BY và chứa cột nonaggregated 'returntr_prod.tbl_customer_pod_uploads.id' mà tôi s không phụ thuộc vào chức năng trên các cột trong mệnh đề GROUP BY; này không tương thích với sql_mode = only_full_group_by

bạn có thể vui lòng cho tôi biết giải pháp tốt nhất ...

Tôi cần quả như

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+ 
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon   | updatedon   | 
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+ 
| 1 |  1 | 78  | 1  | 21.1212 | 21.5454 |   1 |    1 | id_Card.docx |   0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 | 
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+ 
+4

Không sử dụng 'SELECT *'. – shmosel

+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – shmosel

+0

đang nói như thế này SELECT id FROM 'tbl_customer_pod_uploads' WHERE' load_id' = '78' AND 'status' = 'Active' GROUP BY 'proof_type' –

Trả lời

15

này

Biểu # 1 trong tổng số danh sách SELECT không có trong mệnh đề GROUP BY và chứa cột nonaggregated 'returntr_prod.tbl_customer_pod_uploads.id' mà không phải là chức năng phụ thuộc vào các cột trong mệnh đề GROUP BY; này không tương thích với sql_mode = only_full_group_by

sẽ được chỉ đơn giản là giải quyết bằng cách thay đổi chế độ sql trong MySQL bởi lệnh này,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 

Đây là quá trình tôi .. tôi đã sử dụng becz này trong dự án của tôi có rất nhiều truy vấn như thế này vì vậy chỉ cần thay đổi chế độ sql này onli_full_group_by

ThanQ ...:-)

+1

Cảm ơn bạn đã làm việc cho tôi –

10

Khi chế độ only_full_group_by MySQL được bật, nó có nghĩa là các quy tắc SQL ANSI nghiêm ngặt sẽ áp dụng khi sử dụng GROUP BY. Đối với các truy vấn của bạn với, điều này có nghĩa rằng nếu bạn GROUP BY của cột proof_type, sau đó bạn chỉ có thể chọn hai điều:

  • các proof_type cột, hoặc
  • uẩn của bất kỳ cột khác


Bằng "tổng hợp" của các cột khác, ý tôi là sử dụng hàm tổng hợp như MIN(), MAX() hoặc AVG() với một cột khác. Vì vậy, trong trường hợp của bạn truy vấn sau đây sẽ có giá trị:

SELECT proof_type, 
     MAX(id) AS max_id, 
     MAX(some_col), 
     MIN(some_other_col) 
FROM tbl_customer_pod_uploads 
WHERE load_id = '78' AND 
     status = 'Active' 
GROUP BY proof_type 

Side lưu ý: Phần lớn của MySQL GROUP BY câu hỏi mà tôi thấy trên SO có chế độ nghiêm ngặt tắt, do đó truy vấn đang chạy, nhưng với kết quả không chính xác. Trong trường hợp của bạn, truy vấn sẽ không chạy chút nào, buộc bạn phải suy nghĩ về những gì bạn thực sự muốn làm.

+0

Cảm ơn Tim Biegeleisen. –

+1

Chỉ cần một lưu ý: Kết quả không chính xác (theo quy tắc của MySQL), nhưng không thể đoán trước được, có nghĩa là các cột không thuộc nhóm và không được tổng hợp (và không phụ thuộc vào chức năng) sẽ trả về giá trị 'ngẫu nhiên' từ nhóm tương ứng . Khi trạng thái thủ công: "máy chủ được tự do chọn bất kỳ giá trị nào từ mỗi nhóm" – Pred

+0

Vi phạm nhóm nghiêm ngặt không * nhất thiết * tạo ra kết quả không chính xác. Tôi thường làm điều đó khi các trường được đảm bảo giống hệt nhau (ví dụ: tham gia một-nhiều). Và ngay cả khi nó không được đảm bảo, việc chọn một hàng tùy ý sẽ thường không chính xác hơn, sau đó sử dụng hàm tổng hợp hoặc thêm mức nhóm. – shmosel

1

Bạn có thể tắt sql_mode = only_full_group_by bởi một số lệnh bạn có thể thử điều này bằng thiết bị đầu cuối hoặc MySql IDE

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 
0

mở bạn WAMP bảng và MySQL mở tập tin cấu hình. Trong nó tìm kiếm cho "sql_mode" nếu bạn tìm thấy nó đặt nó để "" khác nếu bạn không tìm thấy nó thêm sql_mode = "" vào tập tin.

Khởi động lại máy chủ MySQL và bạn sẵn sàng ...

mã hóa hạnh phúc.

<?= S ?> 
1

Đối với truy vấn là hợp pháp ở SQL92, cột Tên phải được bỏ qua trong danh sách chọn hoặc có tên trong mệnh đề GROUP BY.

SQL99 và sau đó cho phép các nonaggregates như vậy cho mỗi tính năng tùy chọn T301 nếu chúng phụ thuộc vào chức năng trên cột GROUP BY: Nếu mối quan hệ đó tồn tại giữa tên và custid, truy vấn là hợp pháp. Đây sẽ là trường hợp, ví dụ, được giữ một khóa chính của khách hàng.

MySQL 5.7.5 trở lên thực hiện phát hiện sự phụ thuộc chức năng. Nếu chế độ SQL ONLY_FULL_GROUP_BY được bật (mặc định là mặc định), MySQL sẽ từ chối các truy vấn mà danh sách lựa chọn, điều kiện HAVING hoặc danh sách ORDER BY tham chiếu đến các cột không được phân tách không có tên trong mệnh đề GROUP BY. .

qua MySQL :: MySQL 5.7 Reference Manual :: 12.19.3 MySQL Handling of GROUP BY

Bạn có thể giải quyết nó bằng cách thay đổi chế độ sql với lệnh này:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

và ... nhớ để kết nối cơ sở dữ liệu !!!

0

Từ giao diện, tôi cho rằng việc nhóm theo nhiều cột /trường sẽ không làm hỏng kết quả của bạn. Tại sao bạn không thử thêm vào nhóm bằng cách như thế này:

GROUP BY `proof_type`, `id` 

Điều này sẽ nhóm bởi proof_type đầu tiên sau đó id. Tôi hy vọng điều này không làm thay đổi kết quả. Trong một số/hầu hết các trường hợp nhóm theo nhiều cột đều cho kết quả sai.

Các vấn đề liên quan