0

日付とユーザーのテーブルがあります。前の日付から 5 日後の日付のみをカウントする方法を見つけようとする助けが必要です。

id|users_id|date
--------------------------------
1 | 1      | 2013-08-01 00:00:00
2 | 2      | 2013-08-03 00:00:00
3 | 1      | 2013-08-04 00:00:00
4 | 1      | 2013-08-06 00:00:00
5 | 2      | 2013-08-06 00:00:00
6 | 2      | 2013-08-10 00:00:00
7 | 2      | 2013-08-11 00:00:00

次の例では、ユーザー 1 に対して 2 を取得し、ユーザー 2 に対して 2 を取得する必要があります。サブクエリを実行しようとしましたが、比較するタイムスタンプを渡すことができませんでした。どんな助けでも大歓迎です。ありがとうございました。

これが私のクエリの例です。

SELECT 
    tbl1.users_id,
    COUNT(tbl2.date)
FROM table tbl1
LEFT JOIN table tbl2 
    ON tbl2.users_id = tbl1.users_id 
    AND tbl2.date > DATE_ADD(tbl1.date, INTERVAL 5 DAY)
GROUP BY tbl1.users_id;

SELECT 
    tbl1.users_id,
    COUNT(tbl2.date)
FROM table tbl1
LEFT JOIN (
    SELECT users_id, date
    FROM table
    WHERE date > DATE_ADD(tbl1.date, INTERVAL 5 DAY)
) tbl2 ON tbl1.users_id = tbl1.users_id
GROUP BY tbl1.users_id;

サブクエリに tbl1 の日付を入れることができないため、最後のアプローチは明らかに機能しません。

4

1 に答える 1

1

テストされていませんが、おそらく次のようなものです:-

SELECT tbl1.users_id, COUNT(tbl2.date)
FROM (SELECT users_id, date, @Counter:=IF(users_id = @PrevId, @Counter + 1, 1) AS SequenceCtr, @PrevId:=users_id
FROM atable
CROSS JOIN (SELECT @Counter:=0, @PrevId:=0) Sub1
ORDER BY users_id, date) AS tbl1
LEFT OUTER JOIN (SELECT users_id, date, @Counter:=IF(users_id = @PrevId, @Counter + 1, 1) AS SequenceCtr, @PrevId:=users_id
FROM atable
CROSS JOIN (SELECT @Counter:=0, @PrevId:=0) Sub1
ORDER BY users_id, date) AS tbl2
ON tbl1.users_id = tbl2.users_id
AND tbl1.SequenceCtr + 1 = tbl2.SequenceCtr
AND tbl2.date > DATE_ADD(tbl1.date, INTERVAL 5 DAY)
GROUP BY tbl1.users_id;

日付のリストを取得するためのサブセレクトがいくつかありますが、シーケンス番号が追加されています。次に、行ったように参加しますが、シーケンス番号が 1 異なる場所でも参加します。

編集 - SQLフィドルで簡単なテストを行ったところ、うまくいくようです:-

http://sqlfiddle.com/#!2/6c69b/1

于 2013-08-28T16:03:51.130 に答える