2012-03-26 11 views
1

Ich habe die folgende TabelleMYSQL - Gruppe BY mit MAX Ausgabe

Date, TelephoneNumber, Type 
    02/02/12, 123456, b 
    04/02/12, 123456, b 
    07/02/12, 123456, a 
    03/02/12, 789999, a 
    15/02/12, 789999, b 

Wenn die folgenden SQL-Lauf

 select TelephoneNumber, max(Date) as datetime, Type 
     from Table1 
     where Date > '2012-03-25 00:00' 
     group by TelephoneNumber 
     order by date desc; 

Ich stellte fest, dass die Art nicht mit ihrem verbundenen Datum entspricht. Zum Beispiel bin ich immer

07/02/12, 123456, b 
    15/02/12, 789999, a 

Es scheint, dass es den ersten Datensatz in Art nimmt .... auch wenn ich in der umgekehrt sortiert. Kann mir bitte jemand helfen, wie ich dieses Problem lösen kann? Ich benutze MySQL

Vielen Dank im Voraus. sandro

+2

MySQL-group-by-Funktion verwendet die erste angetroffene Reihe in einem Wert für jedes nicht-gruppierte Feld zu füllen in einer Ergebniszeile. Dies ist mit einfachen Abfrageanweisungen wie Ihrer nicht zu vermeiden. Siehe dieses Q & A: http://stackoverflow.com/questions/979034/mysql-shows-incorrect-rows-when-using-group-by –

+0

Was genau ist es, dass Sie erwarten, zu passieren.Eine direktere Frage zu stellen ist immer besser. – kasavbere

Antwort

3

Diese Frage scheint ziemlich oft aufzutauchen.

Hier ist meine Lösung:

SELECT TelephoneNumber, Date AS datetime, Type 
from (SELECT * 
     FROM Table1 
     WHERE Date > '2012-03-25 00:00' 
     ORDER BY Date DESC) AS h 
GROUP BY TelephoneNumber 
ORDER BY date DESC; 

Check explanation here

0

Reihenfolge wird nach dem Gruppieren angewendet. Der Wert von max (Datum) wurde bereits berechnet, Sie sortieren ihn nicht. Was ist msisdn? Es ist unmöglich zu sagen, was mit Ihrer Abfrage passiert, weil das, was Sie tatsächlich gruppieren, undurchsichtig ist.

+0

das war ein Mißverständnis :) bitte jetzt überprüfen – mouthpiec

2

Dies liegt daran, wie §11.16.3 "GROUP BY and HAVING with Hidden Columns" in the MySQL 5.6 Reference Manual es ausdrückt:

MySQL die Verwendung von GROUP BY, so dass die Auswahlliste nicht aggregierten Spalten erstreckt sich in der GROUP BY Klausel nicht genannt verweisen. Dies bedeutet, dass die vorangehende Abfrage in MySQL zulässig ist. Sie können diese Funktion verwenden, um bessere Leistung durch Vermeidung unnötiger Spaltensortierung und Gruppierung zu erhalten. Dies ist jedoch hauptsächlich nützlich, wenn alle Werte in jeder nicht aggregierten Spalte, die nicht in GROUP BY benannt sind, für jede Gruppe gleich sind. Der Server ist frei zu wählen Sie einen beliebigen Wert aus jeder Gruppe, so, wenn sie nicht gleich sind, die Werte sind unbestimmt. Außerdem kann die Auswahl der Werte aus jeder Gruppe nicht durch Hinzufügen einer ORDER BY Klausel beeinflusst werden. Die Sortierung der Ergebnismenge erfolgt nach der Auswahl der Werte, und ORDER BY beeinflusst nicht, welche Werte der Server auswählt.

[Hervorhebung von mir]

Stattdessen müssen Sie so etwas schreiben:

select t1a.TelephoneNumber, t1a.Date, t1a.Type 
    from Table1 as t1a 
    left 
    join Table1 as t1b 
    on t1b.TelephoneNumber = t1a.TelephoneNumber 
    and t1b.Date > t1a.Date 
where t1a.Date > '2012-03-25 00:00' 
    and t1b.TelephoneNumber IS NULL    -- i.e., the join failed 
; 

den Rekord mit den größten Date für jeden Wert von TelephoneNumber zu finden.