0

私は実際にこれを呼び出す方法さえ知りません:P、しかし...

私は1つのテーブルを持っています。それを「アップロード」と呼びましょう

id    owner    date
-----------------------------
0     foo      20100101120000
1     bar      20100101120300
2     foo      20100101120400
3     bar      20100101120600
..    ..       ..
6     foo      20100101120800

今、私が次のようなことをしたとき:

SELECT id FROM uploads ORDER BY date DESC

これにより、次のようになります。

id    owner    date
-----------------------------
6     foo      20100101120800
..    ..       ..
3     bar      20100101120600
2     foo      20100101120400
1     bar      20100101120300
0     foo      20100101120000

質問:いいですね、でも、もっと先に進みたいです。今、タイムラインを作成すると (そして私は :P を実行しました)、foo と bar が何かをアップロードしたというメッセージが「スパム」されます。それらをグループ化し、日付フィールドで「500」の時間制限で最初の結果を返したいと思います。

次のような結果になるには、どのような種類の SQL コマンドが必要ですか。

id    owner    date
-----------------------------
6     foo      20100101120800
3     bar      20100101120600
0     foo      20100101120000

その後、各レコードの呼び出しを実行して、5 分の時間枠で関連レコードを取得できます (これは id=6 の例です)。

SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC

最初のステップをどのように行うべきですか?(結果を制限/グループ化する)

(ところで、これを使いたいときは、すべての日付(YmdHis = 60)をUnix時間(= 100)に変換する必要があることは知っていますが、5分を正確に5分にする必要はありません。時々1分短くなります...)

4

3 に答える 3

1

あなたの例があっても、あなたが得ようとしている結果についてはよくわかりません。おそらく、丸めとグループ化を伴うものです。

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner

必要に応じて、ROUNDの代わりにFLOORまたはCEILINGを使用することをお勧めします。

于 2010-10-22T16:18:35.480 に答える
1

インラインビューを使用しますか?例:

SELECT u1.* 
FROM uploads u1,
(SELECT date 
    FROM uploads u2
    WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
    AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)

'foo'が投稿してから5分以内に行われたすべての投稿を返す必要があります。

于 2010-10-22T15:49:39.177 に答える
1

標準 SQL は間隔をうまく処理しません。異なるタプルの日付を比較するには、テーブルの自己結合を行う必要があります。そうすれば、日付の間隔が 500 以内のタプルのすべてのペアを簡単に見つけることができます。ただし、実際には日付を 500 以内のセットでクラスター化する必要があります。これは、私の知る限り、SQL ではまったく表現できません。

できることは非常に似ています: 合計時間間隔を固定の 500 単位の範囲に分割し、その間隔に基づいてテーブル内のすべてのタプルをクラスター化します。そのためには、最初に次のテーブルまたはクエリ結果が必要ですインターバルの開始時間; これは、テーブルに対する SQL クエリと、タイムスタンプを間隔の開始時刻に「丸める」か、間隔のシーケンス番号を計算する関数を使用して作成できます。次に、2 番目のステップとして、その結果でテーブルを結合して、対応する開始時間に従ってタイムスタンプをグループ化できます。SQL は DBMS に依存するため、ここで説明することはできません。また、これがお客様の状況で目的を達成するための最良の方法であるかどうかもわかりません。

于 2010-10-22T15:09:37.957 に答える