sql >> Database teknologi >  >> RDS >> Mysql

MySQL:SQL-fejl:1140, SQLState:42000

Følgende forespørgsel er ugyldig med ONLY_FULL_GROUP_BY aktiveret. Den første er ugyldig, fordi navnet på den valgte liste ikke er navngivet i GROUP BY klausul

mysql> SELECT name, MAX(age) FROM t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)

uden GROUP-kolonner er ulovligt, hvis der ikke er nogen GROUP BY-klausul

Du kan omskrive forespørgslen for at fungere fint som

mysql> SELECT name, MAX(age) FROM t GROUP BY name;

eller

Sluk ONLY_FULL_GROUP_BY og fejlen skulle forsvinde.

Links kan hjælpe dig

  1. Du kan søge i MySQL-fejl her
  2. group-by-functions
  3. lignende indlæg på stackoverflow.com
  4. et andet forum, hvor lignende problem blev diskuteret
  5. server-sql-mode

OPDATERING

Dette er svar på din kommentar.

But i would like to know more about disabling the Group BY mode in mysql db.  

Server SQL-tilstande

  • MySQL-serveren kan fungere i forskellige SQL-tilstande og kan anvende disse tilstande forskelligt for forskellige klienter, afhængigt af værdien af ​​sql_mode systemvariabel. Denne egenskab gør det muligt for hver applikation at skræddersy serverens driftstilstand til dens egne krav.

  • For at indstille SQL-tilstanden ved serverstart skal du bruge --sql-mode="modes" mulighed på kommandolinjen, eller sql-mode="modes" i en option-fil såsom my.cnf (Unix operating systems) eller my.ini (Windows) . tilstande er en liste over forskellige tilstande adskilt af kommaer. For at rydde SQL-tilstanden eksplicit skal du indstille den til en tom streng ved hjælp af --sql-mode="" på kommandolinjen eller sql-mode="" i en option-fil.

  • For at ændre SQL-tilstanden under kørsel skal du bruge en

    SET [GLOBAL|SESSION] sql_mode='modes'
    udsagn for at indstille systemvariablen sql_mode. Indstilling af GLOBAL-variablen kræver SUPER-privilegiet og påvirker driften af ​​alle klienter, der forbinder fra det tidspunkt. Indstilling af SESSION-variablen påvirker kun den aktuelle klient. Enhver klient kan til enhver tid ændre sin egen session sql_mode værdi.

  • For at bestemme den aktuelle globale eller session sql_mode værdi, brug følgende sætninger:

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;

  • Du kan henvise til sql_mode-tabel

I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode
but no difference.  

Dette sker på grund af MySQL-versionen. Hvad er MySQL-versionen af ​​din lokale computer?

Hvordan tjekker man MySQL-versionen?

mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.5.28    |
+-----------+
1 row in set (0.00 sec)    

Til test af sql_mode ONLY_FULL_GROUP_BY , Jeg oprettede tabellen patient med to kolonner id, name og indsatte poster. Husk sql_mode ONLY_FULL_GROUP_BY er ikke standard indstillet, du skal indstille hvis du vil.

1)MySQL version 5.0.45-community-nt

SELECT name, MAX(id) FROM patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Det mislykkedes, der var ingen mening i at indstille sql_mode til ONLY_FULL_GROUP_BY da det ikke tillader ikke-aggregerede kolonner, der ikke er navngivet i GROUP BY-sætningen.

2) MySQL version 5.1.40-fællesskab

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Derefter efter indstilling af sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

3)MySQL version 5.5.28

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Derefter efter indstilling af sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Konklusion

Som du kan se, mislykkedes forespørgslen på version 5.0.45 og lykkes den/efter 5.1.40 og 5.5.28Før MySQL-versionen 5.1.10(ikke sikker) forespørgsel uden GROUP BY fejler uanset sql_mode ONLY_FULL_GROUP_BY indstillet eller ej.

Nogle interessante fejl og sql_mode faq link

  1. ONLY_FULL_GROUP_BY sql-tilstand er alt for restriktiv
  2. sql-mode:kun fuld gruppe efter tilstand fungerer ikke
  3. MySQL 5.0 ofte stillede spørgsmål:Server SQL-tilstand


  1. MySQL - opret visning ved hjælp af underforespørgsel i FROM-klausul

  2. Postgresql Vælg rækker, hvor kolonne =matrix

  3. Meddelelse af den generelle tilgængelighed af SQL Secure 4.0

  4. Flere kolonner i MATCH MOD