ここではそれでテストされていない刺しです。私はMySQLに精通していないので、他のアプローチがうまくいくかもしれません。これは、limit
とorder by
の使用を避けるセットベースの方法です。あなたがplace_visited
のモードの絆を持っている可能性があるため
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
私はちょうどアルファベット順で、最も低いまま。私はrecorded_date
のための関係がないと仮定しました。
'user_id = 2'は、彼に関連付けられた日付「2016-04-15」を持っていません。この日付はどのように結果セットに現れますか? –