2016-06-01 17 views
0

で最後と最も値を取得します。私は彼が最も訪れた場所のユーザーと名前の最後recorded_dateに訪れた場所を取得しようとしています私はこのようなテーブルuser_placesを持っているmysqlの

user_id recorded_date place_visited 
2  2016-04-05  NY 
2  2016-04-07  UK 
2  2016-04-08  UK 
2  2016-04-08  UK 
3  2016-04-08  AUS 
3  2016-04-09  AUS 
2  2016-04-15  NY 
3  2016-04-15  CAN 

すなわちは

user_id recorded_date_last place_visited_most last_visited_place 
    2  2016-04-15  UK     NY 
    3  2016-04-15  AUS     CAN 
+0

'user_id = 2'は、彼に関連付けられた日付「2016-04-15」を持っていません。この日付はどのように結果セットに現れますか? –

答えて

0

ここでサブクエリを使用した方法です:

select * , 
    (select place_visited from mytable t2 
    where t2.user_id = t1.user_id 
    group by place_visited 
    order by count(*) desc 
    limit 1) place_visited_most 
from mytable t1 
where recorded_date = (select max(recorded_date) from mytable) 

http://sqlfiddle.com/#!9/ad351/4

0

ここではそれでテストされていない刺しです。私はMySQLに精通していないので、他のアプローチがうまくいくかもしれません。これは、limitorder 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のための関係がないと仮定しました。

関連する問題