it-swarm.com.de

1055 - Ausdruck Nr. 1 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält eine nicht aggregierte Spalte

Meine SQL-Anweisung wird auf MySQL (Serverversion: 5.5.62-0ubuntu0.14.04.1 - (Ubuntu)) meines Laptops ordnungsgemäß zurückgegeben, auf meinem Server (Serverversion: 5.7.26-0ubuntu0.16.04.1 - (Ubuntu)) jedoch ordnungsgemäß gibt einen Fehler zurück.

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

1055 - Ausdruck Nr. 1 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'shop.orders.id', die funktional nicht von den Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht kompatibel mit sql_mode = only_full_group_by

2
anjanesh

Ich denke, dieses Problem liegt an strict mode in Ihrer MySQL-Version aktiviert. Bitte deaktivieren Sie den strengen Modus und versuchen Sie es erneut.

Zum Deaktivieren folgen Sie Wie schalte ich den strengen MySQL-Modus in localhost (xampp) ein/aus?

STRICT_TRANS_TABLES ist für die Einstellung des strengen MySQL-Modus verantwortlich.

Um zu überprüfen, ob der strikte Modus aktiviert ist oder nicht, führen Sie die folgende SQL aus:

SHOW VARIABLES LIKE 'sql_mode';

Wenn einer der Werte STRICT_TRANS_TABLES ist, ist der strikte Modus aktiviert, andernfalls nicht. In meinem Fall gab es

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

Daher ist in meinem Fall der strikte Modus aktiviert, da einer der Werte STRICT_TRANS_TABLES ist.

Um den strengen Modus zu deaktivieren, führen Sie die folgende SQL aus:

set global sql_mode='';

[oder ein beliebiger Modus außer STRICT_TRANS_TABLES. Beispiel: set global sql_mode = 'NO_ENGINE_SUBSTITUTION';]

Um den strengen Modus wieder zu aktivieren, führen Sie die folgende SQL aus:

set global sql_mode='STRICT_TRANS_TABLES';

Wenn Sie nicht wissen, was Sie deaktivieren sollen strict_mode dann müssen Sie Ihre SQL-Abfrage ändern, um SQL standard zu folgen.

so was..

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 

für Ihre Anfrage ..

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;

Lassen Sie mich wissen, ob das hilft.

4
Mithun Mandal

Setzen Sie den Rest der Spalten (außer contact_id) innerhalb von Aggregatfunktionen. Nach meiner begrenzten Erfahrung ist MySQL nicht vollständig konsistent darin, wie nicht gruppierte Spalten außerhalb von Aggregatfunktionen behandelt werden. Bester Fall, es ist nicht deterministisch.

1
Cowthulhu