Ihr Problem sein könnte gelöst mit etwas namens Fensterfunktionen, aber MySQL hat keine Unterstützung für diese Art von Funktion.
Ich habe zwei Lösungen für Sie. Einer simuliert eine Fensterfunktion und der andere ist der übliche Weg, um einige Abfragen zu schreiben, um diese Situationen in MySQL anzugehen.
Dies ist die erste ist, die ich this question antwortete:
-- simulates the window function
-- first_value(<col>) over(partition by user_id order by some_count DESC, time_start DESC)
SELECT
user_id,
substring_index(group_concat(time_start ORDER BY some_count DESC, time_start DESC), ',', 1) time_start,
substring_index(group_concat(some_count ORDER BY some_count DESC, time_start DESC), ',', 1) some_count
FROM foo
WHERE DATE(time_start) = '2016-07-27'
GROUP BY user_id
;
Grundsätzlich Sie gruppieren Sie Ihre Daten von user_id
und verkettet alle Werte aus einer bestimmten Spalte mit der ,
Separator, geordnet durch die Spalten, die Sie möchten, für jede Gruppe und substringt dann nur den ersten geordneten Wert. Dies ist kein optimaler Ansatz ...
Und das ist die zweite, die ich this question antwortete:
SELECT
user_id,
some_count,
MAX(time_start) time_start
FROM foo outq
WHERE 1=1
AND DATE(time_start) = '2016-07-27'
AND NOT EXISTS
(
SELECT 1
FROM foo
WHERE 1=1
AND user_id = outq.user_id
AND some_count > outq.some_count
AND DATE(time_start) = DATE(outq.time_start)
)
GROUP BY
user_id,
some_count
;
Grundsätzlich sind die Unterabfrage überprüft für jeden user_id
wenn es welche gibt some_count
höher sie die aktuelle gewesen An diesem Datum überprüft, wie die Hauptabfrage es zu NOT EXISTS
erwartet. Sie werden mit allen höchsten some_count
pro user_id
in einem Datum verlassen, aber für den gleichen höchsten Wert von einem Benutzer können mehrere verschiedene time_start
in diesem Datum existieren. Jetzt sind die Dinge einfach. Sie können sicher GROUP BY
Benutzer und zählen, denn sie sind bereits die Daten, die Sie wollen, und erhalten von der Gruppe das Maximum time_start
.
Diese Art von Unterabfrage ist die gängige Methode, um Probleme wie MySQL zu lösen. Ich empfehle Ihnen, beide Lösungen auszuprobieren, aber wählen Sie die zweite und erinnern Sie sich an die Unterabfrage sintax, um ein zukünftiges Problem zu lösen.
Auch in MySQL wird eine implizite ORDER BY <columns>
in allen Abfragen mit einem GROUP BY <columns>
angewendet. Wenn Sie sich nicht um die Ergebnisreihenfolge kümmern, können Sie einige Verarbeitungen speichern, indem Sie ORDER BY NULL
deklarieren, wodurch die implizite Ordnungsfunktion in Ihrer Abfrage deaktiviert wird.
SELECT DISTINCT (user_id), ... erhalten Sie einen Eintrag pro Benutzer ohne GROUP BY. In welcher Spalte soll der MAX() Wert für? – user3741598
Ich möchte den MAX() -Wert für 'some_count', aber ich muss auch wissen, die MAX()' time_stop' für, wo diese bestimmte 'some_count' übereinstimmt, da es mehrere Zeilen geben könnte, wobei' some_count' ist gleich für 'user_id 'und' time_stop' – randombits
Was ist der Primärschlüssel? –