Hier ist ein ungetestet Stich an sie. Ich bin nicht so vertraut mit MySQL, so dass es andere Ansätze gibt, die besser funktionieren. Dies ist eine set-basierte Methode, die die Verwendung von limit
und order by
vermeidet.
select t.user_id, t.place_visited, modex.cnt, maxd.max_recorded_date
from
T t inner join
(
select user_id, max(recorded_date) as max_recorded_date from T
group by user_id
) maxd
on maxd.user_id = t.user_id
inner join
(
select user_id, max(cnt) as max_cnt
from
(
select user_id, count(*) as cnt from T
group by user_id, place_visited
) counts
group by user_id
) maxc
on maxc.user_id = t.user_id
inner join
(
select user_id, cnt, min(place_visited) as place_most_visited
from
(
select user_id, place_visited, count(*) as cnt from T
group by user_id, place_visited
) break_ties
group by user_id, cnt
) modex
on modex.user_id = maxd.user_id
and maxc.max_cnt = modex.cnt and modex.place_most_visited = t.place_visited
Da Sie Bindungen für den Modus von place_visited
haben konnte ich immer nur die in alphabetischer Reihenfolge am niedrigsten. Ich nahm an, dass es keine Verbindungen für recorded_date
obwohl geben würde.
'user_id = 2' hat kein Datum' 2016-04-15' mit ihm verbunden. Wie kommt es, dass dieses Datum in der Ergebnismenge erscheint? –