3

アプリを使用しているユーザーを追跡するデータベーステーブルがあります。ユーザーごと、1日ごとに複数の用途がある場合があります。したがって、特定の単一ユーザーのレコードセットの例は次のようになります。

userId  dateOfUsage
1       2012-12-01
1       2012-12-02
1       2012-12-02
1       2012-12-03
1       2012-12-06
1       2012-12-07
1       2012-12-07
1       2012-12-08

今日は2012-12-08だとしましょう。今日から最後のレコードまでの日数を3日以上エントリなしで取得したい。上記の例では、2012-12-03と2012-12-06の間に休憩があったので、2012-12-06から今日(2012-12-08)までの日数を数えたいと思います。答えは6日から8日の「3日間の連勝」です。

MySQLでのみこれを行うことは可能ですか?MySQLの特定のユーザーに対してこれを行うにはどうすればよいですか?すべてのユーザーに対して一度にそれを行うことは可能ですか?

縞について他の質問を見つけましたが、私の要求を解決するためにそれらを適応させる運がありませんでした。ありがとう!

4

2 に答える 2

0

カーソル付きのストアドプロシージャを使用して、一時テーブルを作成できます。

または、次のようなことを行うことができます

set @dateOfUsage = NULL;
SELECT * FROM (
  SELECT IF(@dateOfUsage IS NULL, 0, datediff(dateOfUsage, @dateOfUsage)) as gap, @dateOfUsage:=dateOfUsage AS dateOfUsage FROM (
    SELECT * FROM `usage` WHERE userID = 1 ORDER BY dateOfUsage
  ) `usage`
) `t` WHERE gap >= 3;

http://sqlfiddle.com/#!2/22228/2

テーブル内の行の順序は保証されていないため、サブクエリを使用する必要があることに注意してください。

フィルタリングするために別のサブクエリが必要でした(ただし、なぜそうしないのかはわかりHAVINGません)。

于 2013-01-08T17:23:31.010 に答える
0

必要に応じてユーザーをフィルタリングします...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,userId  INT NOT NULL
,dateOfUsage DATE NOT NULL
);

INSERT INTO my_table (userid,dateofusage) VALUES
(1       ,'2012-12-01'),
(1       ,'2012-12-02'),
(1       ,'2012-12-02'),
(1       ,'2012-12-03'),
(2       ,'2012-12-04'),
(2       ,'2012-12-05'),
(1       ,'2012-12-06'),
(1       ,'2012-12-07'),
(1       ,'2012-12-07'),
(1       ,'2012-12-08');

SELECT DATEDIFF('2012-12-08',MAX(b.dateofusage))+1 streak  
  FROM ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) a
  JOIN ( SELECT x.*, COUNT(*) rank FROM my_table x JOIN my_table y ON y.userid = x.userid AND y.id <= x.id GROUP BY x.id) b
    ON b.dateofusage >= a.dateofusage + INTERVAL 3 DAY
   AND b.rank = a.rank + 1
   AND b.userid = a.userid
 GROUP
    BY a.userid;
于 2013-01-08T18:19:12.810 に答える