人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mysql5の質問です

以下のようなテーブルがあります。
テーブル名:access
フィールド名:id,user_id,datetime

ユーザーがサイトにアクセスした時間を記録するテーブルです。
datetimeはタイムスタンプ形式です。


やりたいこと:ユーザー最後にアクセスした時間が新しい順に並べたい。
その際に重複するuser_idは消したい(新しいものだけ残すということです)


とりあえず自分が書いたSQLはこちら
SELECT DISTINCT user_id FROM access ORDER BY datetime

distinctを使うとdistinctの直後に書いたフィールド意外は取得できないのでしょうか?どうも正常に動きません。


予算200ポイント程でお願い致します。

●質問者: tokyosmash
●カテゴリ:インターネット ウェブ制作
✍キーワード:access SELECT SQL アクセス サイト
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● Mook
●25ポイント

下記のようでどうでしょうか。

SELECT user_id, max(datetime) FROM access GROUP BY user_id ORDER BY max(datetime) DESC

user_id ごとにまとめて、その中で最大な日付が、直近のアクセス履歴になると思います。

それを降順で表示すれば、ご希望の結果になるのではないでしょうか。

http://www.atmarkit.co.jp/fnetwork/rensai/sql03/sql1.html

◎質問者からの返答

早速のご回答ありがとうございます。

実際に試してみましたが、確かにuser_idは直近のアクセス通りに並びました。

ただ、idとdatetimeが最新のものではなく最も古いレコードのものになってしまっています。

これはどうすればいいのでしょうか・・。


2 ● b-wind
●50ポイント

ただ、idとdatetimeが最新のものではなく最も古いレコードのものになってしまっています。

GROUP BY を使用した場合は指定したカラムと集合関数しか使えません。

id も表示したければ、

SELECT a.* FROM access AS a WHERE datetime = ( SELECT max(datetime) FROM access AS b WHERE a.user_id = b.user_id ) ORDER BY datetime DESC

などとするしかないでしょう。


ただ、datetime が古いレコードというのは解せませんね。

max という言葉どおり同じ user_id の中で最大(最新)のものを表示しているはずです。

datetimeはタイムスタンプ形式です。

とありますが、実際には型は何でしょう?

文字通り timestamp 型であれば自動更新の副作用があるので、思った値と別の値が入っている可能性もありますが。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.2.2.2 DATETIME、DATE、TIMESTAMP 型


3 ● Mook
●25ポイント

id も表示したかったのですね。


b-wind さんがもっとエレガントな解を提示していそうな気もしますが、下記のようでどうでしょうか。

SELECT * FROM access WHERE CONCAT(user_id,datetime) IN
(SELECT CONCAT(user_id,max(datetime)) FROM access GROUP BY user_id)
ORDER BY datetime DESC

4 ● chuken_kenkou
●25ポイント

<SQL例1>

select *
 from `access`
 where (user_id,`datetime`) in(select user_id,max(`datetime`)
        from `access`
        group by user_id)
 order by user_id 

<SQL例2>

select *
 from `access` as x
 where `datetime`=(select max(`datetime`)
       from `access`
       where user_id=x.user_id)
 order by user_id

5 ● chuken_kenkou
●25ポイント

id列は、時系列に+1ずつ増加するのでしょうか?

同じuser_idで、まったく同じタイムスタンプということもあり得るでしょうか?

その場合の対応版です。

select * from `access`
 where id in(select max(id)
 from `access` as x
 where `datetime` in(select max(`datetime`)
 from `access`
 where user_id=x.user_id)
 group by user_id
 )
 order by id
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ