1

他のフィールドの中に次のフィールドがある「セッション」テーブルがあります。

int int(11),
user_id int(11),
login_date timestamp,
ip varchar(15)

各ユーザーに対して、最後の login_date と最後の 3 つの一意の IP を選択したいと考えています。どうすればエレガントな方法でこれを行うことができますか?

私は解決策を見つけましたが、それは非常に醜く、効果がなく、時間がかかり、mysql と bash スクリプトが混在しています。MySQL でのみこれを行うにはどうすればよいですか?

PS テーブルには約 430 万行あります。

いくつかのサンプル データ: http://sqlfiddle.com/#!2/e9ddd

4

3 に答える 3

3

MYSQLから変換するのに多くの時間がかかりましたSQL SERVER

Performance を向上させるために Query に取り組んでいます。

select 
user_id,
max(cast(login_date as datetime)),
group_concat(distinct ip order by login_date desc SEPARATOR  ' , ')
from 
(
SELECT 
  user_id,
  login_date,
  ip,
  CASE user_id 
   WHEN @curType 
    THEN @curRow := @curRow + 1 
    ELSE @curRow := 1 AND @curType := user_id 
  END as sequence
FROM sessions, (SELECT @curRow := 0, @curType := '') r
ORDER BY user_id asc,login_date desc
)t
where sequence<4
group by user_id

SQL フィドル

于 2013-07-10T09:26:36.170 に答える