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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
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... :-)
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:
proof_type
-Spalte oder
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).
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';
Verwenden Sie eine beliebige Lösung
(1) PHPMyAdmin
wenn Sie phpMyAdmin verwenden, ändern Sie die Einstellung "sql_mode" wie in der Abbildung unten gezeigt .
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.
Ä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
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 !!!
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.
Ö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 ?>
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.
Das ist alles.
Ich habe das in meinem Ec2 gemacht und es hat wie ein Zauber gewirkt.
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.