2011-01-31 7 views
0

これを最もうまく表現する方法がわからないので、私にご負担ください。マイテーブル(簡体字)、次のとおりです。タイムスタンプで閉じるuser_idごとに1つのテーブルから行を選択してください

  • id - 整数 - 自動インクリメント
  • user_id - 整数
  • timestamp - 私は必要なもの日時

は、このテーブルを照会する機能で、 timestamp列があらかじめ定義された時間範囲(潜在的には任意ですが、10分と言うことができます)内にあるすべてのレコードを選択します。したがって、たとえばhypotのエントリがあるかどうかを知りたいと思いますhetical user_id 5 at "2011-01-29 03:00:00"と次に "2011-01-29 03:02:00"であるが、ユーザーが「2011-01-29 03:00: 00 "、次に" 2011-01-29 05:00:00 "に移動します。これはまた、ユーザが前回の時間範囲内で2回以上をサーチする場合を捕捉する必要がある。

バックグラウンドではこれはサイト検索のテーブルです。ユーザーが何かを検索した後、再度検索します(以前の検索では探していた検索結果が表示されなかったと考えられます)。

私はこれがおそらくもっと簡単だと分かっていますが、私はそれを理解しているようには見えません。必要に応じて追加情報を明確にしたり提供したりすることができます。ありがとう!

EDIT: 私は、テーブル内のすべてのユーザーだけでなく、ユーザ#5の結果を返す検索に興味があり、また、実際の時間の入力せずに検索します。タイムスタンプは手動で入力するものであってはなりませんが、代わりに各ユーザーが10分以内の行を見つける必要があります。

答えて

1
SELECT distinct t1.user_id, t1.another_field, t1.another_field 
FROM 
    table t1, 
    table t2 
WHERE 
t1.user_id = t2.user_id 
AND abs(timestampdiff(MINUTE, t1.timestamp, t2.timestamp)) < 10 

あなたは、さらに結果を制限したい場合は、しかし、私は推測としてのuser_id 5を使用していた、

AND t1.timestamp BETWEEN A and B (or > or <) 
+0

これは非常に役に立ちましたが、同じ行に一致するのを防ぐために、 'AND t1.id!= t2.id 'を照会する。ありがとう! – William

1

これはあなたにすべてのユーザーと彼らの制限時間内検索回数与える必要があります:

SELECT user_id, COUNT(*) AS cnt FROM table 
    WHERE timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00" 
    GROUP BY user_id 
    ORDER BY user_id 

これはuser_id #5であなたにだけ作られた検索の回数が表示されます:実際のDBに応じて

SELECT COUNT(*) AS cnt FROM table 
    WHERE user_id=5 
    AND timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00" 

を構文は多少異なりますが、特にBETWEENの条件に渡される日付の形式が異なります。

+0

感謝を追加した日付の範囲を制限するには

AND t1.user_id = any_number (or IN or between, etc) 

を追加することができます。私は、テーブル内のすべてのユーザーの検索結果を返す検索と、入力時間を必要とせずに検索することに興味があります。タイムスタンプは手動で検索するものであってはいけませんが、お互いに10分以内の行を動的に見つける必要があります。これを反映するようにオリジナルの質問を更新します。 – William

+0

1)私はあなたがまだいくつかの時間ウィンドウを分析していると思う2)私はおそらくMIN(タイムスタンプ)、MAX(タイムスタンプ)を最初のクエリに追加し、ユーザーごとにサブクエリを作成します。3)MySqlの組み込みのDate関数を探索しようとすると、私はmysqlと強くはない、ごめんなさい – PeS

関連する問題