Lỗi liên quan đến only_full_group_by khi thực hiện truy vấn trong MySql


442

Tôi đã nâng cấp hệ thống của mình và đã cài đặt MySql 5.7.9 với php cho ứng dụng web tôi đang làm việc. Tôi có một truy vấn được tạo động và khi chạy trong các phiên bản cũ hơn của MySql, nó hoạt động tốt. Kể từ khi nâng cấp lên 5.7 tôi gặp lỗi này:

Biểu thức số 1 của danh sách CHỌN không nằm trong mệnh đề GROUP BY và chứa cột không phân chia 'support_desk.mod_usftimegroups.group_id' không phụ thuộc chức năng vào các cột trong mệnh đề GROUP BY; cái này không tương thích với sql_mode = only_full_group_by

Lưu ý trang Hướng dẫn cho Mysql 5.7 về chủ đề Chế độ SQL của Máy chủ .

Đây là truy vấn gây rắc rối cho tôi:

SELECT mod_users_groups.group_id AS 'value', 
       group_name AS 'text' 
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id 
WHERE  mod_users_groups.active = 1 
  AND mod_users_groups.department_id = 1 
  AND mod_users_groups.manage_work_orders = 1 
  AND group_name != 'root' 
  AND group_name != 'superuser' 
GROUP BY group_name 
HAVING COUNT(`user_id`) > 0 
ORDER BY group_name

Tôi đã làm một số vấn đề về vấn đề này, nhưng tôi không only_full_group_byđủ hiểu để tìm ra những gì tôi cần làm để khắc phục truy vấn. Tôi có thể tắt only_full_group_bytùy chọn này không, hoặc có cần phải làm gì khác không?

Hay noi tôi nêu bạn cân thêm thông tin.


ở đây tôi tìm thấy giải pháp stackoverflow.com/a/7588442/612987
Wasim A.

21
Đây phải là thông báo lỗi phức tạp nhất mà tôi từng gặp.
Rolf

2
@Rolf Bạn đã thấy lỗi cho cùng loại vấn đề trong Oracle chưa? " not a GROUP BY expression" Đó là nó. Họ cũng có thể chỉ có một mã lỗi số và không có thông báo nào cả.
Bill Karwin

Câu trả lời:


359

Tôi chỉ cần thêm group_idvào GROUP BY.

Khi SELECTing một cột không phải là một phần của GROUP BYcó thể có nhiều giá trị cho cột đó trong các nhóm, nhưng sẽ chỉ có khoảng trống cho một giá trị trong kết quả. Vì vậy, cơ sở dữ liệu thường cần được cho biết chính xác làm thế nào để biến nhiều giá trị đó thành một giá trị. Thông thường, điều này được thực hiện với một chức năng tổng hợp như COUNT(), SUM(), MAX()vv ... Tôi nói thường bởi vì hầu hết các hệ thống cơ sở dữ liệu phổ biến khác nhấn mạnh về vấn đề này. Tuy nhiên, trong MySQL trước phiên bản 5.7, hành vi mặc định đã được tha thứ nhiều hơn vì nó sẽ không khiếu nại và sau đó tự ý chọn bất kỳ giá trị nào ! Nó cũng có mộtANY_VALUE()chức năng có thể được sử dụng như một giải pháp khác cho câu hỏi này nếu bạn thực sự cần hành vi tương tự như trước đây. Tính linh hoạt này có chi phí vì nó không mang tính quyết định, vì vậy tôi sẽ không đề xuất nó trừ khi bạn có lý do rất chính đáng để cần nó. MySQL hiện đang bật only_full_group_bycài đặt theo mặc định vì những lý do chính đáng, vì vậy tốt nhất bạn nên làm quen với nó và làm cho các truy vấn của bạn tuân thủ nó.

Vậy tại sao câu trả lời đơn giản của tôi ở trên? Tôi đã đưa ra một vài giả định:

1) group_idlà duy nhất. Có vẻ hợp lý, đó là một 'ID' sau khi tất cả.

2) group_namecũng là duy nhất. Đây có thể không phải là một giả định hợp lý. Nếu đây không phải là trường hợp và bạn có một số trùng lặp group_namesvà sau đó bạn làm theo lời khuyên của tôi để thêm group_idvào GROUP BY, bạn có thể thấy rằng bây giờ bạn nhận được nhiều kết quả hơn trước vì các nhóm có cùng tên sẽ có các hàng riêng biệt trong kết quả. Đối với tôi, điều này sẽ tốt hơn việc ẩn các nhóm trùng lặp này vì cơ sở dữ liệu đã lặng lẽ chọn một giá trị tùy ý!

Đó cũng là một thực hành tốt để đủ điều kiện tất cả các cột có tên bảng hoặc bí danh của chúng khi có nhiều hơn một bảng liên quan ...

SELECT 
  g.group_id AS 'value', 
  g.group_name AS 'text' 
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
WHERE g.active = 1 
  AND g.department_id = 1 
  AND g.manage_work_orders = 1 
  AND g.group_name != 'root' 
  AND g.group_name != 'superuser' 
GROUP BY 
  g.group_name, 
  g.group_id 
HAVING COUNT(d.user_id) > 0 
ORDER BY g.group_name

Cảm ơn bạn, điều đó làm việc hoàn hảo. Tôi cũng đồng ý rằng tôi cần phải đủ điều kiện các cột. Nó loại bỏ bất kỳ khả năng mơ hồ. Tôi đang trong quá trình sửa chữa mã bây giờ. Cảm ơn một triệu vì sự giúp đỡ.
Dan Bemowski

Tôi thậm chí không có một GROUP BYmệnh đề trong truy vấn của mình, nhưng tôi đang gặp lỗi này.
aitchkhan

@HaroonKhan, nghe có vẻ như một câu hỏi mới. Hãy cho tôi biết nếu bạn hỏi nó và tôi sẽ xem xét.
davmos

2
Trong MySQL 5.7, họ đặt một thuộc tính yêu cầu tất cả các trường không tổng hợp trong truy vấn là NHÓM THEO. Vì vậy, một truy vấn như bảng CHỌN a, SUM (b) TỪ; có nghĩa là trường "a" Phải nằm trong NHÓM THEO. Vì vậy, nếu bạn không có NHÓM THEO thì bạn phải thêm nó vào truy vấn. Đó là tất cả về nếu bạn có ít nhất một trường tổng hợp trong phần CHỌN của truy vấn của bạn.
dùng1567291

tôi đã phải sửa "cảnh báo" bằng cách thêm mục vào nhóm theo mệnh đề như được đề xuất trong câu trả lời này vì không có câu trả lời nào cho thấy bản sửa lỗi sql_mode hoạt động. (MySQL của tôi đang trong một quy trình được lưu trữ nhưng không biết điều đó có liên quan không)
zzapper

354

Bạn có thể thử tắt only_full_group_bycài đặt bằng cách thực hiện các thao tác sau:

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';

MySQL 8 không chấp nhận NO_AUTO_CREATE_USERvì vậy cần phải loại bỏ.


85
Đây là một công việc xung quanh, bạn nên khắc phục truy vấn của mình tốt hơn là tắt tiếng cảnh báo
azerafati

1
Cập nhật /etc/mysql/my.cnf (như được thấy bên dưới) là một giải pháp bền vững hơn vì các cài đặt mặc định có xu hướng quay trở lại sau khi khởi động lại. Và đối với những người nói rằng bạn nên sửa truy vấn, thì điều đó đôi khi không dễ dàng khi bạn cần một truy vấn gỡ lỗi nhanh và thực hiện những việc như SELECT COUNT(*), t.* FROM my_table t GROUP BY colvà bạn có 20-50 cột, bạn có muốn dành nhiều thời gian đó để thêm từng cột vào nhóm theo?
Shadoweb

3
"Giải pháp" này khá nguy hiểm. Bạn có thể kích hoạt các chế độ bạn đã tắt trước đó bằng cách thay đổi chúng một cách mù quáng thay vì chỉ xóa cờ một cài đặt được đề cập. Điều này có thể dẫn đến hành vi không mong muốn và trong trường hợp xấu nhất dẫn đến kết quả sai hoặc ngăn (các) ứng dụng của bạn hoạt động hoàn toàn. Do đó tôi coi câu trả lời này là sai.
Chris S.

1
Tôi đã thực hiện điều này một cách bền bỉ thông qua việc làm mới bằng cách tìm ra sql_mode hiện tại của tôi thông qua SELECT @@sql_mode;và sau đó thêm kết quả từ đó vào my.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
wbhending

323

bạn có thể tắt thông báo cảnh báo như được giải thích trong các câu trả lời khác hoặc bạn có thể hiểu những gì đang xảy ra và khắc phục nó.

Kể từ phiên bản MySQL 5.7.5, chế độ SQL mặc định bao gồm CHỈ_ULL_GROUP_BY , có nghĩa là khi bạn đang nhóm các hàng và sau đó chọn một cái gì đó trong số các nhóm đó, bạn cần nói rõ ràng nên chọn hàng nào. Mysql cần biết hàng nào trong nhóm bạn đang tìm kiếm, cung cấp cho bạn hai tùy chọn

Mysql cần biết hàng nào trong nhóm bạn đang tìm kiếm, cung cấp cho bạn hai tùy chọn

  • Bạn cũng có thể thêm cột bạn muốn vào câu lệnh nhóm group by rect.color, rect.valuecó thể là điều bạn muốn trong một số trường hợp nếu không sẽ trả về kết quả trùng lặp với cùng màu mà bạn có thể không muốn
  • bạn cũng có thể sử dụng các hàm tổng hợp của mysql để chỉ ra hàng nào bạn đang tìm kiếm bên trong các nhóm như AVG() MIN() MAX() danh sách đầy đủ
  • VÀ cuối cùng bạn có thể sử dụng ANY_VALUE()nếu bạn chắc chắn rằng tất cả các kết quả trong nhóm đều giống nhau. tài liệu

25
Tôi không nghĩ rằng MySQL hỗ trợ FIRST()phương thức / chức năng?
Ben Guild

3
Tôi tin rằng MySQL (ít nhất là trước 5.7) mặc định lấy giá trị đầu tiên mà nó tìm thấy trong một nhóm. Vì vậy, không có FIRST () vì nó từng đồng nghĩa với chính hàm BY BY.
DrDamnit

2
@DrDamnit, tôi tin rằng nó giống như lựa chọn ngẫu nhiên hơn trong các trường hợp như vậy dẫn đến sự nhầm lẫn và do đó cho phép ONLY_FULL_GROUP_BYtheo mặc định
azerafati

6
Tôi đã biết câu trả lời, nhưng ví dụ với hình chữ nhật màu rất dễ hiểu, tôi sẽ sử dụng lại lần sau khi ai đó hỏi tôi về nó.
user327961

@azerafati có một cái gì đó như FIRST () hoặc một số truy vấn có thể được sử dụng để nhận giá trị đầu tiên, như trường hợp với tôi.
Haris

169

Nếu bạn không muốn thực hiện bất kỳ thay đổi nào trong truy vấn hiện tại của mình thì hãy làm theo các bước dưới đây -

  1. ssh vagrant vào hộp của bạn
  2. Kiểu: sudo vim /etc/mysql/my.cnf
  3. Cuộn xuống dưới cùng của tệp và nhập Ađể vào chế độ chèn
  4. Sao chép và dán

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  5. Nhập escđể thoát chế độ đầu vào

  6. :wqđể lưu và đóng vim.
  7. Nhập sudo service mysql restartđể khởi động lại MySQL.

Chỉ cần một người đứng đầu cho tất cả người dùng Vagrant đang cố gắng sử dụng điều này với AdonisJS, bạn cần điều này để chạy paginatechức năng.
Michael J. Calkins

Điều này rõ ràng không chỉ dành cho người dùng Vagrant, mà bất kỳ hệ thống Unix nào. Lưu ý rằng đối với tôi vị trí của my.cnftập tin là /etc. Als lưu ý cú pháp mới kể từMySQL 5.7.8: sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Valentin Grégoire

Làm việc cho tôi trong Mint 19.3 (ubfox 18.04) cảm ơn
Marco López

71

Sử dụng ANY_VALUE()để chỉ cột không phân chia.

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

Từ tài liệu MySQL 5.7 :

Bạn có thể đạt được hiệu ứng tương tự mà không cần vô hiệu hóa ONLY_FULL_GROUP_BY bằng cách sử dụng ANY_VALUE()để tham khảo cột không kết hợp.

...

Truy vấn này có thể không hợp lệ khi ONLY_FULL_GROUP_BYđược bật vì cột địa chỉ không kết hợp trong danh sách chọn không được đặt tên trong GROUP BYmệnh đề:

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

Nếu bạn biết rằng, đối với một tập dữ liệu nhất định, trên thực tế, mỗi giá trị tên sẽ xác định duy nhất giá trị địa chỉ, địa chỉ phụ thuộc một cách hiệu quả vào tên. Để yêu cầu MySQL chấp nhận truy vấn, bạn có thể sử dụng ANY_VALUE()hàm:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

1
Là một người đã gặp phải vấn đề này một thời gian - tôi đặc biệt thích giải pháp này vì nó không yêu cầu bạn thay đổi bất kỳ tệp hoặc cài đặt nào trong thiết lập MySQL của bạn. Thật thú vị, tôi không thấy ANY_VALUE đề cập đến bất cứ nơi nào khác trong các cuộc thảo luận tương tự - hoạt động hoàn hảo cho tôi với GROUP_BY contains nonaggregated columnlỗi của tôi .
adstwlearn

50

Tôi sẽ cố gắng giải thích cho bạn những gì lỗi này là về.
Bắt đầu từ MySQL 5.7.5, tùy chọn ONLY_FULL_GROUP_BYđược bật theo mặc định.
Do đó, theo SQL92 nổi bật và trước đó:

không cho phép các truy vấn mà danh sách 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 gộp trong mệnh đề GROUP BY cũng như không phụ thuộc chức năng vào (được xác định duy nhất bởi) cột BY BY

( đọc thêm trong tài liệu )

Ví dụ:

SELECT * FROM `users` GROUP BY `name`;

Bạn sẽ nhận được thông báo lỗi sau khi thực hiện truy vấn ở trên.

# 1055 - Biểu thức số 1 của danh sách CHỌN không nằm trong mệnh đề GROUP BY và chứa cột không được phân tách 'testsite.user.id' không phụ thuộc chức năng vào các cột trong mệnh đề GROUP BY; cái này không tương thích với sql_mode = only_full_group_by

Tại sao?
Bởi vì MySQL không hiểu chính xác, những giá trị nhất định từ các bản ghi được nhóm để lấy và đây là điểm chính.

IE cho phép bạn có hồ sơ này trong usersbảng của mình :
Bạn

Và bạn sẽ thực hiện truy vấn không hợp lệ hiển thị ở trên.
Và bạn sẽ nhận được lỗi hiển thị ở trên, bởi vì, có 3 bản ghi có tên Johnvà nó rất hay, nhưng, tất cả chúng đều có các emailgiá trị trường khác nhau .
Vì vậy, MySQL chỉ đơn giản là không hiểu cái nào trong số chúng sẽ trả về trong kết quả được nhóm lại.

Bạn có thể khắc phục sự cố này bằng cách thay đổi truy vấn của mình như sau:

SELECT `name` FROM `users` GROUP BY `name`

Ngoài ra, bạn có thể muốn thêm nhiều trường vào phần CHỌN, nhưng bạn không thể làm điều đó, nếu chúng không được tổng hợp, nhưng có một cái nạng bạn có thể sử dụng (nhưng không được đề xuất):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

nhập mô tả hình ảnh ở đây

Bây giờ, bạn có thể hỏi, tại sao sử dụng ANY_VALUErất không được khuyến khích?
Vì MySQL không biết chính xác giá trị của các bản ghi được nhóm để lấy và bằng cách sử dụng chức năng này, bạn yêu cầu nó tìm nạp bất kỳ trong số chúng (trong trường hợp này, email của bản ghi đầu tiên có tên = John đã được tìm nạp).
Chính xác tôi không thể đưa ra bất kỳ ý tưởng nào về lý do tại sao bạn muốn hành vi này tồn tại.

Xin vui lòng, nếu bạn không hiểu tôi, hãy đọc thêm về cách nhóm trong MySQL hoạt động, nó rất đơn giản.

Và cuối cùng, đây là một truy vấn đơn giản hơn nhưng hợp lệ.
Nếu bạn muốn truy vấn tổng số người dùng theo độ tuổi khả dụng, bạn có thể muốn ghi lại truy vấn này

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

Đó là hoàn toàn hợp lệ, theo quy tắc MySQL.
Và như thế.

Điều quan trọng là phải hiểu chính xác vấn đề là gì và chỉ sau đó viết ra giải pháp.


Cảm ơn câu trả lời tốt đẹp này. Nếu tôi cũng muốn các email như một mảng trong nhóm kết quả thì sao?
Giô

1
Bạn luôn có thể yêu cầu GROUP_CONCAT để nhận mọi mục nhập.
Abraham Trifov

Oh! vì vậy có một cách! Xin hãy giúp tôi trong câu hỏi này
Josiah

Cảm ơn câu trả lời tuyệt vời này. Nếu tôi muốn làm thì GROUP BY DAY(created_date)sao? Có vẻ như nó không hoạt động nếu DAY()được thêm vào.
eskimo

41

Tôi đang sử dụng Laravel 5.3, mysql 5.7.12, trên trang trại laravel (0.5.0, tôi tin)

Ngay cả sau khi cài đặt chỉnh sửa rõ ràng /etc/mysql/my.cnfđể phản ánh:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Tôi vẫn nhận được lỗi.

Tôi đã phải thay đổi config/database.phptừ truethành false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

Đọc thêm:

https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customifying-in-laravel -5-2


Đăng! Điều đó rất hữu ích cho người dùng Laravel. +1 cho điều đó.
Okafor T Kosiso

20

Nếu bạn đang sử dụng wamp 3.0.6 hoặc bất kỳ phiên bản nào khác ngoài phiên bản 2.5 ổn định, bạn có thể gặp phải vấn đề này, trước tiên, vấn đề là với sql. bạn phải đặt tên cho các lĩnh vực phù hợp. nhưng có một cách khác để bạn có thể giải quyết nó. nhấp vào biểu tượng màu xanh lá cây của wamp. mysql-> cài đặt mysql-> sql_mode-> không có. hoặc từ bàn điều khiển, bạn có thể thay đổi các giá trị mặc định.

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';

thật tuyệt vời, dựa trên những gì anh ấy nói, chèn lệnh show variables like '%sql_mode%';trong dòng lệnh mysql, cài đặt sql_mode sẽ hiển thị
Jade Han

19

Bổ sung các dòng (đề cập dưới đây) trong tệp: /etc/mysql/my.cnf

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Làm việc tốt cho tôi. Phiên bản máy chủ: 5.7.18-0ubfox0.16.04.1 - (Ubuntu)


1
bạn đang sử dụng RDS?
Mubasshir Pawle

@MubasshirPawle Không
Jagdeep Singh

16

Truy cập mysql hoặc phpmyadmin và chọn cơ sở dữ liệu sau đó chỉ cần thực hiện truy vấn này và nó sẽ hoạt động. Nó làm việc tốt cho tôi.

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

Tuyệt vời..Cảm ơn :)
mohitesachin217

Niềm vui của tôi :) @mohit
Anil Gupta

Tiết kiệm cho tôi rất nhiều thời gian, cảm ơn.
JoeRaid

1
Chào mừng bạn @TharinduEranga
Anil Gupta

1
Nhưng vấn đề với giải pháp là mỗi lần tôi khởi động lại mysql tôi cần thực hiện lại truy vấn. Nó có nghĩa là giải pháp không vĩnh viễn hoặc liên tục.
Mushfiqur Rahman

10

Đối với máy Mac:

1. Sao chép mặc định my-default.cnf thành /etc/my.cnf

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

2.Thay đổi sql_mode trong my.cnf bằng trình chỉnh sửa yêu thích của bạn và đặt nó vào đây

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3. Khởi động lại máy chủ MySQL.

mysql.server restart

Cảm ơn, làm việc cho tôi là tốt. Nhưng tôi sử dụng mysql mặc định của Mac, vì vậy tôi không có đường dẫn bia. Chỉ cần sudo cp my-default.cnf /etc/my.cnf
Mike Nguyễn

2
@Mike Nguyễn sudo cp /usr/local/mysql-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/my.cnf sudo vi / etc , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITNING Khởi động lại máy chủ MySQL.
Yong Gao

7

Đây là điều giúp tôi hiểu toàn bộ vấn đề:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Và trong ví dụ khác về một truy vấn có vấn đề.

Có vấn đề:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

Giải quyết bằng cách thêm phần này vào cuối:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

Lưu ý: Xem thông báo lỗi trong PHP, nó cho bạn biết vấn đề nằm ở đâu.

Thí dụ:

Lỗi truy vấn MySQL 1140: Trong truy vấn tổng hợp không có GROUP BY, biểu thức số 4 của danh sách CHỌN chứa cột không phân chia 'db.gameplay.timestamp'; cái này không tương thích với sql_mode = only_full_group_by - Truy vấn: CHỌN COUNT (*) là các lần thử, SUM (đã trôi qua) dưới dạng elapsedtotal, userid, timestamp, questionid, answerid, SUM (chính xác) là đúng, đã trôi qua (NGAY BÂY GIỜ (), INTERVAL 1 NGÀY) VÀ userid = 1

Trong trường hợp này, biểu thức số 4 bị thiếu trong NHÓM THEO.


1
Cảm ơn bạn đã chỉ ra stackoverflow.com/questions
20074562 / từ

Câu trả lời tuyệt vời để giải quyết vấn đề này. Cảm ơn bạn rất nhiều
Hansana Athukorala

7

Đối với localhost / wamperver 3, chúng ta có thể đặt sql-mode = user_mode để loại bỏ lỗi này:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

sau đó khởi động lại wamp hoặc apache


1
Tôi biết điều này có thể không phải là một sửa chữa lâu dài cho vấn đề này, nhưng nó chắc chắn đã giúp đỡ cho đến bây giờ. Công ty lưu trữ của tôi, Go Daddy, đang sử dụng MySQL V5.6.33 và WampServer 3 sử dụng MySQL V5.7.14. Cảm ơn giải pháp khắc phục nhanh này
Alan N

4

Bạn có thể thêm một unique indexvào group_id; nếu bạn chắc chắn đó group_idlà duy nhất.

Nó có thể giải quyết trường hợp của bạn mà không sửa đổi truy vấn .

Một câu trả lời muộn, nhưng nó chưa được đề cập trong câu trả lời. Có lẽ nó nên hoàn thành các câu trả lời đã toàn diện có sẵn. Ít nhất nó đã giải quyết trường hợp của tôi khi tôi phải chia một bảng có quá nhiều trường.


2

Nếu bạn gặp lỗi này với Symfony khi sử dụng trình tạo truy vấn học thuyết và nếu lỗi này do orderBy gây ra :

Hãy chú ý đến selectcột bạn muốn groupByvà sử dụng addGroupBythay vì groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

Hoạt động trên Symfony3 -


1

Xin lỗi vì không sử dụng SQL chính xác của bạn

Tôi đã sử dụng truy vấn này để vượt qua cảnh báo Mysql.

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

lưu ý chìa khóa cho tôi

count(*) AS cnt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.