2017-03-29 4 views
0

Ich habe diese Anfrage:Weird-Ergebnis in MySQL-Abfrage

SELECT COUNT(1), name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter

Für diese Abfrage der Zählerspalte erhöht seinen Wert mit 2.

Aber wenn ich entfernen COUNT (1), wie :

SELECT name, (@i := @i + 1) AS counter FROM mytbl, (SELECT @i := 0) tmp_tbl GROUP BY counter

Zählerspalte erhöht seinen Wert mit 1

Kann jemand erklären, warum dieses Verhalten?


Tabelle wäre: create table mytbl (name VARCHAR(20));

Mit Daten:

INSERT INTO mytbl VALUES ('a1'), ('a2'), ('a3');

+0

Ohne Beispieldaten, die uns helfen würden reproduzieren das Problem, das Sie erwähnen, es ist wirklich schwer, das Problem zu untersuchen. –

+0

@GiorgosBetsos Bitte beachten Sie die Änderung. :) – artaxerxe

Antwort

1

Wie in MySQL document erwähnt, sollten wir keinen Wert auf eine Benutzervariablen zuweisen und den Wert innerhalb der Lese gleiche Aussage. Wir könnten die erwarteten Ergebnisse erhalten, aber das ist nicht garantiert. Das Ändern der Anweisung (z. B. durch Hinzufügen einer GROUP BY-, HAVING- oder ORDER BY-Klausel) kann dazu führen, dass MySQL einen Ausführungsplan mit einer anderen Bewertungsreihenfolge auswählt.

In Ihrer Abfrage Zähler Feld wird in SELECT-Anweisung ausgewertet und dann in GROUP BY-Anweisung verwendet werden. Wenn wir der SELECT-Anweisung eine Aggregationsfunktion hinzufügen, wird das Feld, das in der GROUP BY-Anweisung verwendet wird, zwei Mal ausgewertet.

Ich habe eine demo erstellen, können Sie es überprüfen. In der Demo habe ich diese Abfrage

SELECT Count(1), 
     name, 
     (@i := @i + 1) AS counter, 
     (@j := @j + 1) AS group_field 
FROM (SELECT 'A' AS name 
     UNION 
     SELECT 'B' AS name 
     UNION 
     SELECT 'C' AS name) mytable, 
     (SELECT @i := 0) tmp_tbl, 
     (SELECT @j := 0) tmp_tbl1 
GROUP BY group_field; 

Im Ausführungsergebnis, Zähler Feld nur durch 1 und group_field erhöht wird von 2.em

erhöht werden, um das Zählerfeld zu machen nur steigende von 1, können Sie versuchen, diese

SELECT Count(1), 
     name, 
     counter 
FROM (SELECT name, 
       (@i := @i + 1) AS counter 
     FROM mytbl, 
       (SELECT @i := 0) tmp_tbl) data 
GROUP BY counter;