2016-06-25 3 views
0

so bin ich dabei, meinen Server auf eine neue Maschine zu migrieren. Ich installiere die neuere Version von MySQL 5.7.13 auf der neuen Maschine, während die alte mysql 5.5.13. und es ist dies eine Frage, die nicht funktioniert, wie es vor mit den gleichen Daten wie in früheren Server arbeitetmysql bestellen von gefolgt von der Gruppe von

select * 
    from 
    (select * 
     from user_config 
     where username like '%' 
      and updatetime <= '2500-01-01 00:00:00' 
     order 
      by updatetime desc 
    ) x 
group 
    by username; 

der MySQL-5.5.13 funktioniert, wie ich will, es die neueste Konfiguration von jedem Benutzer laden. aber die 5.7.13 lädt stattdessen die älteste Konfigurationseinstellung jedes Benutzers

Warum passiert das?

Ich habe versucht, die Unterabfrage laufen und es funktioniert sowohl in Ordnung, aber wenn ich auf die Abfrage darüber kombinieren funktioniert i ist nicht

Beispieldaten

username|value|updatetime 
a  | 100|2014-01-01 00:00:00 
b  | 85|2014-06-01 00:00:00 
a  | 150|2016-05-01 00:00:00 
c  | 50|2016-06-01 00:00:00 
c  | 75|2016-06-23 00:00:00 

Ergebnis brauchen

a|150 
b|85 
c|75 
+1

Die Syntax, die Sie verwenden, ist eine nicht standardmäßige MySQL-Erweiterung für ANSI SQL. Für jede nicht gruppierte Spalte wird ein zufälliger Wert aus der Gruppe zurückgegeben. Es ist also pures Glück, dass Sie die erste Zeile Ihrer Unterabfrage bekommen haben. Da die gewählte Zeile nicht spezifiziert ist, kann sie sich von Version zu Version ändern. Diese Abfrage ist wirklich schlechtes Design. Ändern Sie Ihre Abfrage, um nicht von undokumentiertem Verhalten abhängen (5.5 passiert, die erste Zeile zu wählen, aber dies ist nicht Teil der Spezifikation) –

Antwort

2
SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT username 
      , MAX(updatetime) updatetime 
     FROM my_table 
     GROUP 
      BY username 
    ) y 
    ON y.username = x.username 
    AND y.updatetime = x.updatetime; 
+0

Tippfehler: Setzen Sie Alias ​​x für my_table –

+0

@Msfvtp Froh, dass jemand aufmerksam ist. Fest. – Strawberry

0

Verwenden Sie Reihenfolge und Limit 1 in Unterabfrage, um das gewünschte Ergebnis zu erhalten:

select * from user_config t1 
Where updatetime=(select updatetime from user_config x where x.username=t1.username order by updatetime desc limit 1); 
+0

Ich bearbeitet meine Post mit Beispiel, wenn ich Gruppe vor Reihenfolge durch sie laden die älteste Konfiguration für jeden Benutzer – kittykotty

+0

Ok ich verstehe das Problem jetzt und ich werde meine Antwort so schnell wie möglich aktualisieren. –

+0

Was ist der T1? Denkst du, du hast eine Zeile vergessen? – kittykotty