1

一部の日付の値を選択する必要があります。これを行う方法はわかっていますが、解決できない問題が 1 つあります。

MySQL の私のテーブル:

[User]. [Wins]. [DATE]
#
Ivan ....... 4 ..... 05/06/2010
#
Ivan ....... 3 ..... 06/15/2010
#
Ivan ........ 6 ..... 06/18/2010
#
Ivan ........ 1 ..... 29/06/2010

問題は、ユーザーがサイトにアクセスしていない場合、データベース内の行が作成されず、取得された日付が失われることです。

2010 年 6 月 6 日から 2010 年 6 月 14 日までの期間などの統計 (0 勝など) を取得するにはどうすればよいですか? このクエリを作成するのに役立ちます。

4

3 に答える 3

3

MySQL には再帰機能がないため、NUMBERS テーブル トリックを使用する必要があります。

  1. 増加する数値のみを保持するテーブルを作成します - auto_increment を使用して簡単に実行できます:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 以下を使用してテーブルに入力します。

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...必要な数の値に対して。

  3. DATE_ADDを使用して日付のリストを作成し、NUMBERS.id 値に基づいて日数を増やします。

    SELECT x.*
      FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY), '%m/%d/%Y') 
              FROM numbers n
             WHERE DATE_ADD('2010-06-06', INTERVAL n.id -1 DAY) <= '2010-06-14 ) x
    
  4. 時間部分に基づいて、データのテーブルに LEFT JOIN します。

       SELECT x.ts AS timestamp,
              COALESCE(COUNT(y.wins), 0) AS cnt
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY), '%m/%d/%Y') AS ts
                 FROM numbers n
                WHERE DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) <= '2010-06-14') x
    LEFT JOIN TABLE y ON STR_TO_DATE(y.date, '%m/%d/%Y') = x.ts
     GROUP BY x.ts
    
于 2010-08-03T03:48:19.550 に答える
0

'wins'フィールドで'sum'集計関数を試して、(whereを使用して)その特定の日付範囲に制限します(つまり、date <= '6/14/2010' AND date> = '06/06/2010')。

つまり、SELECT SUM(wins)FROM [tbl_name] WHERE [DATE] between [date1]AND[date2]のようなものです。

各日付範囲での勝利数を取得します。各ユーザーがその日付範囲で獲得した勝利数を確認するには、「groupby[user]」を追加します。

于 2010-08-03T03:15:00.240 に答える
0

これは、トリックを行うと思われる答えです。日付のリストを表示する一時テーブルを作成します (開始日と終了日のループを使用して挿入します。開始日自体を含めたいため、カウンターは 0 から開始する必要があります)。

次に、DateList を Wins テーブルに結合して、範囲内のすべての日付、ユーザー、およびそれらの日付の訪問のリストを表示します。私はそれをテストしていませんが、コードはまさにあなたが必要としているものに近いと思います.

DECLARE Counter INT DEFAULT 0
DECLARE NumDays INT DEFAULT DATEDIFF(StartDate, EndDate)

CREATE TEMPORARY TABLE DateList
(
    [Date] DATETIME
)

WHILE Counter <= NumDays
    INSERT INTO DateList ([Date]) VALUES (DATE_ADD(StartDate, INTERVAL Counter Day))
    SET Counter = Counter + 1
END WHILE

SELECT
    [User]  
    ,COUNT(User) AS Wins
    ,DateList.[Date] AS [Date]
FROM
    DateList LEFT JOIN Wins ON Wins.[Date] = DateList.[Date]
WHERE
    DateList.[Date] BETWEEN StartDate AND EndDate
GROUP BY
    [User]
    ,DateList.[Date]
ORDER BY
    DateList.[Date]

編集:結合とカウントにいくつかの変更を加えました。MSSQL バージョンをテストしましたが、正常に動作します。

于 2010-08-03T03:23:45.107 に答える