SELECT-lijst staat niet in GROUP BY-clausule en bevat niet-geaggregeerde kolom … incompatibel met sql_mode=only_full_group_by

BEN met MySQL 5.7.13 op mijn Windows-pc met WAMP Server

Hier is mijn probleem tijdens het uitvoeren van deze zoekopdracht

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

Ik krijg altijd zo’n foutmelding

Expressie #1 van de SELECT-lijst staat niet in de GROUP BY-clausule en bevat niet-geaggregeerde kolom ‘returntr_prod.tbl_customer_pod_uploads.id’ die functioneel niet afhankelijk is van kolommen in de GROUP BY-clausule; dit is niet compatibel met sql_mode=only_full_group_by

Kun je me alsjeblieft de beste oplossing vertellen…

Ik heb resultaten nodig zoals

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

Antwoord 1, autoriteit 100%

Deze

Expression # 1 van de selectielijst is niet in groep per clausule en bevat niet-gegronde kolom ‘retourtrod.tbl_customer_pod_uploads.id’ die niet functioneel afhankelijk is van kolommen in groep per clausule; Dit is incompatibel met SQL_MODE = only_full_group_by

wordt eenvoudig opgelost door de SQL-modus in MySQL te wijzigen op deze opdracht,

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

Dit werkt ook voor mij ..
Ik heb dit gebruikt, want in mijn project zijn er veel vragen zoals deze, dus ik heb deze SQL-modus net gewijzigd in alleen_full_group_by

Bedankt …: -)


2, Autoriteit 33%

Wanneer MySQL’s ONLY_FULL_GROUP_BYModus is ingeschakeld, betekent dit dat strenge ANSI SQL-regels van toepassing zijn bij het gebruik van GROUP BY. Met betrekking tot uw zoekopdracht betekent dit dat als u GROUP BYvan de proof_typekolom, dan kunt u alleen twee dingen selecteren:

  • De proof_typeKolom of
  • aggregaten van een andere kolom

Door “aggregaten” van andere kolommen, bedoel ik met behulp van een geaggregeerde functie zoals MIN(), MAX()of AVG()met een andere kolom. Dus in uw geval zou de volgende vraag geldig zijn:

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

Bij de overgrote meerderheid van de MySQL GROUP BY-vragen die ik op SO zie, is de strikte modus uitgeschakeld, dus de query wordt uitgevoerd, maar met onjuiste resultaten. In jouw geval wordt de zoekopdracht helemaal niet uitgevoerd, waardoor je moet nadenken over wat je echt wilt doen.

Opmerking: De ANSI SQL breidt de selectie uit in GROUP BYdoor ook kolommen op te nemen die functioneel afhankelijkzijn van de geselecteerde kolom(men). Een voorbeeld van functionele afhankelijkheid is het groeperen op een primaire sleutelkolom in een tabel. Aangezien de primaire sleutel gegarandeerd uniek is voor elke record, wordt de waarde van elke andere kolom ook bepaald. MySQL is een van de databases die dit mogelijk maakt (SQL Server en Oracle doen geen AFAIK).


Antwoord 3, autoriteit 25%

Er is een systeemvariabele “ONLY_FULL_GROUP_BY”in de MySql-engine.

Vanaf Mysql-versie 5.7.5: ONLY_FULL_GROUP_BY SQL-modus is standaard ingeschakeld

Vóór versie 5.7.5: ONLY_FULL_GROUP_BY was standaard niet ingeschakeld.

Als de ONLY_FULL_GROUP_BY SQL-modus is ingeschakeld (wat standaard het geval is vanaf versie 5.7.5), wijst MySQL query’s af waarvoor de selectielijst, HAVING-voorwaarde of ORDER BY-lijst verwijzen naar niet-geaggregeerde kolommen die geen van beide zijn genoemd in de GROUP BY-clausule en zijn er ook niet functioneel afhankelijk van.

Gebruik één van de onderstaande oplossingen om het probleem op te lossen

(1) PHPMyAdmin

Uitschakelen: ONLY_FULL_GROUP_BY modus

als je phpMyAdmin gebruikt, verander dan de “sql_mode” instelling zoals vermeld in de onderstaande schermafbeelding.

Variabele SQL-modus “bewerken en de tekst” Only_full_group_by “uit de waarde

verwijderen

of

(2) SQL / opdrachtprompt

Uitschakelen : only_full_group_by-modus door het onderstaande opdracht te gebruiken.

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

of

(3) Gebruik niet Selecteer *

Niet uitschakelen de alleen_full_group_by-modus maar

Gebruik de relevante kolom in Select Query. Relevant: Kolommen, die ofwel komen in “Groep per” clausule of kolom met de geaggregeerde functie (max, min, som, tellen, enz.)


Belangrijke opmerking

Wijzigingen die worden aangebracht door het gebruik van punt (1) of punt (2) stelt het niet permanent in en deze zal na elke herstart terugkeren.

Dus u moet dit in uw config-bestand (bijvoorbeeld /etc/mysql/my.cnf in het [MYSQLD] -gedeelte) instellen, zodat de wijzigingen van kracht blijven na het opnieuw opstarten van MySQL:

Config-bestand : /etc/mysql/my.cnf

variabele naam : sql_mode of SQL-modus

Word alleen_full_group_by uit de waarde en sla het bestand op.

Opmerking : als u geen “SQL_MODE” -variabele in het configuratie-bestand hebt gevonden dan voeg onder 2 regels aan aan het einde van het bestand

[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

4, Autoriteit 11%

only_full_group_by = onvertelt MySQL-engine: pas GROUP BYniet toe als je twijfelt over welke resultaten je moet tonen en een foutmelding geeft. pas het alleen toe als GROUP BYu specifiek vertelt wat u moet doen. d.w.z. wanneer de GROUP BYvol en perfect is!

only_full_group_by = offvertelt MySQL-engine: pas altijd GROUP BYtoe en als je twijfelt over welke resultaten je moet kiezen, kies er dan willekeurig een uit!

Je hoeft het niet uit te zetten als je GROUP BYcorrect gebruikt!

Voorbeeld:

Tabel: gebruikers

id   |  name
----------------
  1      ali
  2      john
  3      ali

Als je GROUP BYgebruikt in de kolom name:

SELECT * FROM users GROUP BY name;

Er zijn twee mogelijke resultaten:

 1      ali
  2      john     

OF

 2      john
  3      ali

MYSQL weet niet welk resultaat te kiezen! Omdat er verschillende id‘s zijn, maar beide hebben name=ali.

Oplossing1:

alleen het veld nameselecteren:

SELECT name FROM users GROUP BY name;

resultaat:

 ali
  john     

Dit is een perfecte oplossing. kolommen verwijderen die GROUP BYverwarren. Dit betekent dat je weet wat je doet. Meestal heb je geen
Die kolommen, maar als je ze nodig hebt, ga dan naar Oplossing3!

oplossing2:

Uitschakelen ONLY_FULL_GROUP_BY. MySQL kiest een van de twee mogelijke resultaten willekeurig !! (Het is goed als het je niet echt om geeft wat idhet zal kiezen, maar vergeet niet om het direct na uw zoekopdracht uit te schakelen om onverwacht gedrag in toekomstige groepsbys te voorkomen)

oplossing3

Gebruik een AggregateFunctie zoals MIN(), MAX()om MySQL te helpen beslissen wat het moet kiezen.

Bijvoorbeeld:

SELECT MAX(id), name FROM users GROUP BY name;

Resultaat:

 2      john
  3      ali

Het kiest de rij alimet de maximale id.


5, Autoriteit 7%

u kunt uitschakelen
sql_mode = only_full_group_by
Met een opdracht kunt u dit proberen met Terminal of MySQL IDE

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

Antwoord 6, autoriteit 6%

In Ubuntu

Stap 1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

Stap 2: Ga naar de laatste regel en voeg het volgende toe

sql_mode = ""

Stap 3: Opslaan

Stap 4: herstart mysql-server.


Antwoord 7, autoriteit 4%

Hallo, in plaats van alle kolommen te nemen, neem je gewoon wat je nodig hebt door ANY_VALUE(column_name)te gebruiken. Het werkt perfect. Even checken.

Bijvoorbeeld:

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

Antwoord 8, autoriteit 4%

Om ervoor te zorgen dat de query legaal is in SQL92, moet de naamkolom worden weggelaten uit de selectielijst of een naam krijgen in de GROUP BY-clausule.

SQL99 en hoger staan dergelijke niet-aggregaties per optionele functie T301 toe als ze functioneel afhankelijk zijn van GROUP BY-kolommen: als een dergelijke relatie bestaat tussen naam en custid, is de zoekopdracht legaal. Dit zou bijvoorbeeld het geval zijn als een primaire sleutel van klanten wordt bewaard.

MySQL 5.7.5 en hoger implementeert detectie van functionele afhankelijkheid. Als de ONLY_FULL_GROUP_BY SQL-modus is ingeschakeld (wat standaard het geval is), verwerpt MySQL query’s waarvoor de selectielijst, HAVING-voorwaarde of ORDER BY-lijst verwijzen naar niet-geaggregeerde kolommen die geen naam hebben in de GROUP BY-clausule en er ook niet functioneel afhankelijk van zijn .

via MySQL :: MySQL 5.7 Referentiehandleiding :: 12.19.3 MySQL-verwerking van GROUP BY

Je kunt het oplossen door de sql-modus te wijzigen met dit commando:

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

en … vergeet niet de database opnieuw te verbinden!!!


Antwoord 9, autoriteit 2%

ga naar de phpmyadmin en open de console en voer dit verzoek uit

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

Antwoord 10, autoriteit 2%

> sudo nano /etc/mysql/my.cnf

Vul hieronder in

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

Antwoord 11, autoriteit 2%

Van hoe het eruit ziet, denk ik dat groeperen op meerdere kolommen/veldengeen afbreuk doet aan uw resultaat. Waarom probeer je niet als volgt toe te voegen aan de groep:

GROUP BY `proof_type`, `id`

Dit wordt eerst gegroepeerd op proof_typeen daarna op id. Ik hoop dat dit de resultaten niet verandert. In sommige/meeste gevallen geeft groeperen op meerdere kolommen verkeerde resultaten.


Antwoord 12, autoriteit 2%

Ik had met dit probleem te maken en de volgende vraag was niet genoeg

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

omdat ik Opgeslagen proceduregebruikte. Na het uitvoeren van deze query moest ik de procedure laten vallen en opnieuw aanmaken.


Antwoord 13, autoriteit 2%

Ik had een soortgelijk probleem met het verpletteren van een deel van mijn database. Wat ik deed, is dat ik de parameter in de DB via de PHPStorm-databaseconsole als volgt heb gewijzigd:

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

werkt nu als een tierelier


Antwoord 14

Zoek naar “SQL-modus” als u PhpMyAdmin gebruikt en verwijder de waarde: ONLY_FULL_GROUP_BY, net gedaan en het is goed.


Antwoord 15

  1. Log in op phpMyAdmin
  2. Navigeer naar: Server: localhost:3306 en doe
    geen database selecteren
  3. Klik op variabelen in het hoofdmenu
  4. Zoek naar “sql-modus” en bewerk de bijbehorende waarde in: NO_ENGINE_SUBSTITUTION

Dat is alles.

Ik deed dit in mijn Ec2 en het werkte als een tierelier.


Antwoord 16

Hier is een heel snelle en gemakkelijke manier om het permanent in te stellen

NB: het uitvoeren van SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));is tijdelijk en bij het herstarten van de server krijg je nog steeds de fout.
Om dit permanent op te lossen, doet u het onderstaande

  1. Log in op uw server als root
  2. in uw terminal run
    wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. Maak het uitvoerbaar bestand door het uitvoeren van chmod +x disable-strict-mode.sh
  4. Voer het script uit door het gebruik van ./disable-strict-mode.sh

En uw voltooide, wijzigingen worden aangebracht in MySQL en het zal opnieuw worden opgestart


17

Update voor MySQL 8.0

Uw sql-modeHEBT NIET NO_AUTO_CREATE_USERZoals het is verwijderd zoals hier wordt vermeld – How-to-Set-SQL-MODE-IN-MY-CNF-IN-MYSQL-8

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

Ook als iemand geen my.cnf-bestand heeft, kunnen ze een nieuwe in /etc/my.cnfmaken en vervolgens de bovenstaande regels toevoegen.


18

Voordat u uw zoekopdracht uitvoert, voert u onderstaande query

SET SQL_MODE = '';

19

voor die met Centos / Rhel (Linux-server) en XAMPP lokaal

Hallo, ik ben naar een heel andere oplossing gekomen en ik hoop dat dit een Somone helpt. (Ziet er misschien overkill uit, maar dit werkte echt voor mij in tegenstelling tot andere oplossingen)

Ik loop CentOS 7 en al mijn code werkte lokaal, maar toen ik het naar mijn server geüpload, begon ik de fout te krijgen die deze vraag heeft.

Na enkele uren probeerde ik het probleem vanuit een andere hoek te bekijken, ik herinnerde me dat mijn lokale setup xampp gebruikt en ik dacht dat ik MySQL 8 gebruikte (MySQL 8 was geïnstalleerd op mijn server).

Maar nadat ik me had aangemeld bij MySql vanuit XAMPP kreeg ik de volgende uitvoer:

mysql -u root -p //Login
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 27
Server version: 10.4.18-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Ja, je hebt misschien hetzelfde opgemerkt, XAMPP gebruikt MariaDB, dus de oplossing was om mysql te verwijderen en MariaDB te installeren

En terwijl ik Centos 7 gebruik, zijn de stappen om dit te doen de onderstaande:

  1. Verwijder mysql van uw server

# yum remove mysql mysql-server
  1. Update je systeem (dit is gebruikelijk elke keer dat we iets nieuws installeren)

# sudo yum  -y update
  1. MariaDB toevoegen aan repository

# sudo tee /etc/yum.repos.d/MariaDB.repo<<EOF 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
  1. Cache bijwerken

# sudo yum makecache fast
  1. Installeer MariaDB

# sudo yum -y install MariaDB-server MariaDB-client
  1. Voeg MariaDB toe aan het opstarten (Start MariaDB elke keer dat uw systeem opnieuw wordt opgestart)

#sudo systemctl enable --now mariadb

Vervolgens kunt u uw installatie beveiligen door het volgende commando uit te voeren:

# sudo mysql_secure_installation

Deze laatste opdracht zal een proces starten waarin u een wachtwoord en andere opties kunt instellen.

Vergeet daarna niet om een niet-rootgebruiker toe te voegen en deze de nodige privileges te verlenen, dat is omdat je de rootgebruiker niet in je applicaties kunt gebruiken (Ja, daar moest ik later achter komen)

Eerst inloggen met het root-account:

# mysql -u root -p

Voeg vervolgens uw gebruiker toe en verleen privileges:

CREATE USER 'YourUserName'@localhost IDENTIFIED BY 'YourPassword';
GRANT ALL PRIVILEGES ON *.* TO 'YourUserName'@localhost IDENTIFIED BY 'YourPassword' WITH GRANT OPTION;

En tot slot moet je je database maken, je tabellen/gegevens/triggers/procedures importeren.

Nu kunt u uw code zonder problemen uitvoeren, net als uw lokale installatie. (Misschien moet je mysql-extensies installeren voor het geval je het ook lokaal zou moeten doen).


Antwoord 20

Je kunt ook gewoon GROUP_CONCAT()toevoegen aan de niet-geaggregeerde kolommen.

zoals GROUP_CONCAT(your_column)


Antwoord 21

Log in op phpMyAdmin
Navigeer naar: Server: http://localhost/phpmyadmin en selecteer geen database
Klik op SQL in het bovenste menu en plaag onderstaande code Voer SQL-query/query’s uit op de server
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Sorce link


Antwoord 22

Open je WAMP-paneel en open het MySQL-configuratiebestand. Zoek daarin naar “sql_mode” als je het vindt, stel het in op “” anders voeg je sql_mode=”” toe aan het bestand als je het niet vindt.

Herstart de MySQL-server en u bent klaar om te gaan…

veel plezier met coderen.


Antwoord 23

In uw my.inischrijft u dit:

[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"

afhankelijk van uw versie. Of:

[mysqld]
sql_mode = ""

of verwijder dit eenvoudig: ONLY_FULL_GROUP_BY

Other episodes