HiveBrain v1.2.0
Get Started
← Back to all entries
patternsqlModerate

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
expression1055nonaggregatedgroupcolumnselectcontainsandlistnot

Problem

My SQL statement returns properly on my laptop's MySQL (Server version: 5.5.62-0ubuntu0.14.04.1 - (Ubuntu)) but on my server (Server version: 5.7.26-0ubuntu0.16.04.1 - (Ubuntu)) it returns an error.

SELECT * 
FROM `orders` 
WHERE `mail_sent`='No' 
  AND `datetime` < DATE_SUB(NOW(), INTERVAL 15 MINUTE) 
GROUP BY `contact_id` 
ORDER BY `datetime` ASC;



1055 - Expression #1 of SELECT list is not in GROUP BY clause and
contains nonaggregated column 'shop.orders.id' which is not
functionally dependent on columns in GROUP BY clause; this is
incompatible with sql_mode=only_full_group_by

Solution

I think this problem due to strict mode enabled in your MySQL version. Kindly disable strict mode and try again.

To disable follow How to turn on/off MySQL strict mode in localhost (xampp)?

STRICT_TRANS_TABLES is responsible for setting MySQL strict mode.

To check whether strict mode is enabled or not run the below sql:

SHOW VARIABLES LIKE 'sql_mode';


If one of the value is STRICT_TRANS_TABLES, then strict mode is enabled, else not. In my case it gave

+--------------+------------------------------------------+ 
|Variable_name |Value                                     |
+--------------+------------------------------------------+
|sql_mode      |STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION|
+--------------+------------------------------------------+


Hence strict mode is enabled in my case as one of the value is STRICT_TRANS_TABLES.

To disable strict mode run the below sql:

set global sql_mode='';


[or any mode except STRICT_TRANS_TABLES. Ex: set global sql_mode='NO_ENGINE_SUBSTITUTION';]

To again enable strict mode run the below sql:

set global sql_mode='STRICT_TRANS_TABLES';


If you don't what to disable strict_mode then you have to change your sql query to follow sql standard.

like this..

SELECT
   aggregated_column,
   aggregated_column,
   aggregation_function(column),
   aggregation_function(column),
   aggregation_function(column)
FROM
  TABLE
WHERE [CLAUSE]
GROUP BY [GROUP BY FIELD]
WHILE [CLAUSE]
ORDER BY


for your query..

SELECT 
  contact_id,
  min(mail_sent),
  min(datetime),
  max(datetime),
FROM `orders` 
WHERE `mail_sent`='No' 
  AND `datetime` < DATE_SUB(NOW(), INTERVAL 15 MINUTE) 
GROUP BY `contact_id` 
ORDER BY `datetime` ASC;


Let me know if that helps.

Code Snippets

SHOW VARIABLES LIKE 'sql_mode';
+--------------+------------------------------------------+ 
|Variable_name |Value                                     |
+--------------+------------------------------------------+
|sql_mode      |STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION|
+--------------+------------------------------------------+
set global sql_mode='';
set global sql_mode='STRICT_TRANS_TABLES';
SELECT
   aggregated_column,
   aggregated_column,
   aggregation_function(column),
   aggregation_function(column),
   aggregation_function(column)
FROM
  TABLE
WHERE [CLAUSE]
GROUP BY [GROUP BY FIELD]
WHILE [CLAUSE]
ORDER BY

Context

StackExchange Database Administrators Q#237048, answer score: 14

Revisions (0)

No revisions yet.