it-swarm.com.de

Die SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält eine nicht aggregierte Spalte

AM mit MySQL 5.7.13 auf meinem Windows-PC mit WAMP Server

Hier liegt mein Problem beim Ausführen dieser Abfrage

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

Bekomme immer Fehler wie diesen 

Der Ausdruck # 1 der SELECT-Liste ist nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'returntr_prod.tbl_customer_pod_uploads.id', die funktional nicht von Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht mit sql_mode = only_full_group_by kompatibel

Können Sie mir bitte die beste Lösung nennen ...

Ich brauche Ergebnis wie

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
13
Dhanu K

Diese 

Der Ausdruck # 1 der SELECT-Liste ist nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'returntr_prod.tbl_customer_pod_uploads.id', die funktional nicht von Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht mit sql_mode = only_full_group_by kompatibel

wird einfach gelöst, indem der SQL-Modus in MySQL durch diesen Befehl geändert wird.

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

Das funktioniert auch ... Ich habe dies verwendet, weil in meinem Projekt viele Abfragen wie diese vorhanden sind

Danke dir... :-)

52
Dhanu K

Wenn der only_full_group_by-Modus von MySQL aktiviert ist, bedeutet dies, dass bei Verwendung von GROUP BY strikte ANSI SQL-Regeln gelten. In Bezug auf Ihre Abfrage bedeutet dies, dass Sie, wenn Sie GROUP BY der proof_type-Spalte verwenden, nur zwei Dinge auswählen können:

  • die proof_type-Spalte oder
  • aggregate einer anderen Spalte


Mit "Aggregaten" anderer Spalten meine ich die Verwendung einer Aggregatfunktion wie MIN(), MAX() oder AVG() mit einer anderen Spalte. In Ihrem Fall wäre also die folgende Abfrage gültig:

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

Die überwiegende Mehrheit der GROUP BY-Fragen von MySQL, die ich auf SO sehe, haben den strikten Modus deaktiviert. Die Abfrage wird also ausgeführt, jedoch mit falschen Ergebnissen. In Ihrem Fall wird die Abfrage überhaupt nicht ausgeführt, sodass Sie darüber nachdenken müssen, was Sie wirklich tun möchten.

Hinweis: Das ANSI-SQL-Modul erweitert die in GROUP BY auswählbaren Elemente um Spalten, die funktional abhängig von den ausgewählten Spalten sind. Ein Beispiel für eine funktionale Abhängigkeit wäre das Gruppieren nach einer Primärschlüsselspalte in einer Tabelle. Da garantiert wird, dass der Primärschlüssel für jeden Datensatz eindeutig ist, wird auch der Wert einer anderen Spalte bestimmt. MySQL ist eine der Datenbanken, die dies zulässt (SQL Server und Oracle nicht AFAIK).

21
Tim Biegeleisen

Sie können disable sql_mode = only_full_group_by Deaktivieren. Mit einem Befehl können Sie dies über das Terminal oder die MySql-IDE versuchen

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';
10
Anil Gupta

Verwenden Sie eine beliebige Lösung

(1) PHPMyAdmin

wenn Sie phpMyAdmin verwenden, ändern Sie die Einstellung "sql_mode" wie in der Abbildung unten gezeigt .  enter image description here

Bearbeiten Sie die Variable "SQL-Modus" und entfernen Sie den Text "ONLY_FULL_GROUP_BY" aus dem Wert

(2) Eingabeaufforderung Führen Sie den folgenden Befehl aus. 

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

(3) SELECT nicht verwenden *

Verwenden Sie die entsprechende Spalte in der SELECT-Abfrage. relevant bedeutet Spalten, die entweder in der Klausel "Gruppe nach" oder in der Spalte mit der Aggregatfunktion (MAX, MIN, SUM, COUNT usw.) erscheinen.


Wichtige Notiz

Änderungen, die unter Verwendung von Punkt (1) OR Punkt (2) vorgenommen werden, werden nicht dauerhaft gesetzt und werden nach jedem Neustart zurückgesetzt.

Sie sollten dies also in Ihrer Konfigurationsdatei festlegen (z. B. /etc/mysql/my.cnf im Abschnitt [mysqld]), damit die Änderungen nach dem Neustart von MySQL wirksam bleiben:

Config File: /etc/mysql/my.cnf

Variablenname: sql_mode ODER sql-mode

5
Rakesh Soni

Damit die Abfrage in SQL92 zulässig ist, muss die Namensspalte aus der Auswahlliste weggelassen oder in der GROUP BY-Klausel angegeben werden.

SQL99 und spätere Versionen erlauben solche Nichtaggregate für das optionale Feature T301, wenn sie funktional von den GROUP BY-Spalten abhängig sind: Wenn eine solche Beziehung zwischen name und custid besteht, ist die Abfrage zulässig. Dies wäre zum Beispiel der Fall, wenn Kunden einen primären Schlüssel haben.

MySQL 5.7.5 und höher implementiert die Erkennung funktionaler Abhängigkeiten. Wenn der SQL-Modus ONLY_FULL_GROUP_BY aktiviert ist (standardmäßig aktiviert), lehnt MySQL Abfragen ab, für die die Auswahlliste, die HAVING-Bedingung oder die ORDER BY-Liste auf nicht aggregierte Spalten verweist, die weder in der GROUP BY-Klausel genannt noch funktional abhängig sind .

via MySQL :: MySQL 5.7 Referenzhandbuch :: 12.19.3 MySQL-Behandlung von GROUP BY

Sie können das Problem lösen, indem Sie den SQL-Modus mit diesem Befehl ändern:

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

und ... vergessen Sie nicht, die Datenbank erneut zu verbinden !!!

4
ElliotMok

Die folgende Methode hat mein Problem gelöst:

In Ubuntu

Art: Sudo vi /etc/mysql/my.cnf

geben Sie A ein, um in den Einfügemodus zu wechseln

In der letzten Zeile fügen Sie unter zwei Zeilen Code ein:

[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

Geben Sie esc ein, um den Eingabemodus zu verlassen

Type :wq to save and close vim.

Geben Sie sudo service mysql restart ein, um MySQL neu zu starten.

1
Anand H

Öffnen Sie Ihr WAMP-Panel und öffnen Sie die MySQL-Konfigurationsdatei. Suchen Sie dort nach "sql_mode", wenn Sie es finden, setzen Sie es auf "", wenn Sie es nicht finden, fügen Sie der Datei sql_mode = "" hinzu.

Starten Sie den MySQL-Server neu und Sie können loslegen ...

glückliche Kodierung.

<?= S ?>
0

So wie es aussieht, denke ich, dass das Gruppieren nach mehreren Spalten/Feldern das Ergebnis nicht verletzt. Warum versuchst du nicht, der Gruppe so hinzuzufügen:

GROUP BY `proof_type`, `id`

Dies wird zuerst nach proof_type und dann id gruppiert. Ich hoffe, das ändert nichts an den Ergebnissen. In einigen/meistens Fällen führt die Gruppierung nach mehreren Spalten zu falschen Ergebnissen.

0
jkkenzie
  1. Melden Sie sich bei phpMyAdmin an
  2. Navigieren Sie zu: Server: localhost: 3306 und wählen Sie keine Datenbank aus
  3. Klicken Sie im oberen Menü auf Variablen
  4. Suchen Sie nach "sql mode" und bearbeiten Sie den entsprechenden Wert zu: NO_ENGINE_SUBSTITUTION

Das ist alles.

Ich habe das in meinem Ec2 gemacht und es hat wie ein Zauber gewirkt.

0
PrafulPravin

Die Antwort von Dhanu K und Anil Gupta hat bei mir funktioniert, Sie müssen jedoch mysql im Terminal neu starten, um das Ergebnis zu sehen.

0
Meder Mamutov