2016-11-03 2 views
0

Ich möchte nach t0.method in strikte Zeichenfolge Vergleich, d. H. "GET", "GET" und "Get" in andere Gruppe, so eine BINARY vor dem t0.method Feld, das in der Gruppe nach Satz erscheint hinzugefügt. aber Ich kann kein BINARY zu diesem Feld hinzufügen, das im Select-Satz erscheint, da dies ein Codierungsproblem verursachen wird, wenn Nicht-ASCII-Zeichen in den Daten erscheint.Wie "gruppieren von" in strikte String-Vergleich, wenn sql_mode = only_full_group_by in MySql gesetzt ist?

So folgenden wird die SQL-Abfrage, die ich endlich:

SELECT `t0`.`method` AS `d0`, 
    SUM(`t0`.`success`) AS `m0` 
FROM `invoke_statistics` AS `t0` 
GROUP BY BINARY `t0`.`method` 
LIMIT 20000 

Aber leider habe ich die folgende Fehlermeldung dann ..

Expression # 1 von SELECT-Liste ist in GROUP BY nicht Klausel und enthält nicht aggregierte Spalte 't0.method', die nicht funktional auf Spalten in GROUP BY-Klausel; dies ist unvereinbar mit sql_mode = only_full_group_by

Also, was ist der richtige Weg, dies alles mit den „sql_mode = only_full_group_by“ Dingen, ohne dass eine Codierung Problem oder Inkompatibilitätsproblem zu tun?

HINWEIS:

  1. Ich bin nicht in der Lage, die sql_mode Option zu ändern.
  2. Ich bin nicht in der Lage, sicherzustellen, dass keine nicht-ASCII-Zeichen in den Daten
  3. erscheint Ich kann nicht wissen, welche Zeichensatz verwendet wird, bevor eine Abfrage generiert. so dass die collate utf8_bin oder ähnliches ist nicht in der Lage zu arbeiten, da es einige Fehler verursachen können wie COLLATION 'UTF8_BIN' is not valid for CHARACTER SET 'latin1'

Ich bin etwas über Code-Generierung zu tun, so die Antwort der anderen, die auf eine Menge von Annahmen abhängig nicht lösen können mein Problem, ich brauche einige allgemeine Lösung

+0

Versuchen Sie 'SELECT t0.method COLLATE Latin1_General_CS_AS AS ... ' – sagi

+0

Oder Google' SQL GROUP VON CASE SENSITIVE' – sagi

+0

@sagi Ich habe gefunden [this] (http://stackoverflow.com/questions/10952696/how -to-a-case-sensitive-group-by) aber es gibt nichts hilfreiches .. – luochen1990

Antwort

0

die beiden folgenden Arbeit, wenn der SQL-Modus enthält ONLY_FULL_GROUP_BY:

Machen Sie Ihre Gruppierungsspalte Teil der Auswahlliste:

SELECT BINARY `t0`.`method` AS `d0`, 
    SUM(`t0`.`success`) AS `m0` 
FROM `invoke_statistics` AS `t0` 
GROUP BY BINARY `t0`.`method` 
LIMIT 20000 

Oder machen Sie Ihre Auswahlliste eine Aggregatfunktion verwenden:

SELECT MAX(`t0`.`method`) AS `d0`, 
    SUM(`t0`.`success`) AS `m0` 
FROM `invoke_statistics` AS `t0` 
GROUP BY BINARY `t0`.`method` 
LIMIT 20000 

ich beide Abfragen auf MySQL 8.0 DMR getestet.

0

(Es scheint zwei Fragen in einer Person zu sein, diese die Sortierung Problem behebt..)

Plan A

Die „richtige“ Antwort ist die Sortierung in der Tabellendefinition zu ändern:

CREATE TABLE ... 
    method ... COLLATE xxx_bin 
    ... 

Wo xxx ist der Zeichensatz beteiligt.Das ist (anscheinend) latin1_bin. ("Latin1_General_CS_AS" kommt von einem anderen Anbieter, nicht MySQL.)

Caveat: Dadurch werden alle anderen Vergleiche beeinflussen (WHERE, ORDER BY, =) Einbeziehung der Spalte method. (Dies kann oder kann nicht ein Problem sein.)

Plan B

So wie es in der Abfrage zu tun ist,

... GROUP BY method COLLATE latin1_bin ... 

A COLLATE Klausel kann auf eine Vielzahl von Dingen anheften einschließlich Vergleiche und ORDER BY. Beachten Sie jedoch, dass die Verwendung eines Index für die Optimierung verhindert wird.

+0

Thx für Ihre Antwort, aber, 1. Ich kann nicht ändern, die Definition der Tabelle, 2. Ich bin nicht sicher, was der Zeichensatz in der ursprünglichen Tabelle verwendet wird, so die 'COLLATE latin1_bin' Lösung kann einen Fehler in MySQL verursachen ... – luochen1990

Verwandte Themen