0

列を持つテーブルがあります: id、name、date、present 現在の列には値 0 または 1 または 2 があります ... さらに、現在の月 2013-07-01 - 2013-07-31 に 0 値がいくつあるかを数える必要がありますただし、10 回以上ある場合のみカウントします。

たとえば、2013-07-01 から 2013-07-10 の値が 0 の場合、それをカウントし、11、12、またはそれ以上のように 10 日以上連続していることを通知する必要がありますが、10 未満の場合は何もカウントしないでください。 .

スタックからいくつかの例を試していました...しかし、それらは別の問題です...そのmysqlクエリについてはほとんど助けが必要です。

私はこのようなものを持っていますが、>= 10のように連続した10日が必要です

$sql = mysql_query("SELECT COUNT(name) as count FROM `table` WHERE (`present` = 0) AND (`date` BETWEEN '2013-07-01' AND '2013-07-31')");

while($row = mysql_fetch_array($sql)){
    $result = $row['count'];
}

2013-07-01 から 2013-07-31 までの日付の 0 値ごとにカウントされますが、10 日以上の連続した日から始まる日数をカウントする必要があります

存在する列には0と1、2、3などの他の数字があるため、10日以上連続して0のみをカウントする必要があります

これがSqlFiddleです。私は答えからワーキングを作ろうとしていました http://sqlfiddle.com/#!2/1bde8/2

よろしくお願いします。

4

3 に答える 3

2

このアプローチでは、相関サブクエリを使用して 2 つの値を計算します。

最初の値は、前のレコードの日付ですPresent = 1Present = 0これにより、 を使用して連続した日数を取得できますdatediff()

2 番目はPresent明日の値でNULL、月の最終日になります。今日がPresent = 0で、明日が1またはNULLの場合、このレコードを使用できます。一連の0s の終わりです。

そこからは、設定した条件に従って値を合計するだけの問題です。次のクエリは、各 に対してこれを行うことを前提としていますname

select name, sum(case when datediff(date, lastPresentDate) >= 10
                      then datediff(date, lastPresentDate)
                 else 0 end) as DaysCounted
from (select t.*,
             (select coalesce(max(date), '2013-06-30')
              from t t2
              where t2.name = t.name and
                    t2.present <> 0 and
                    t2.date <= t.date and
                    t2.date between '2013-07-01' and '2013-07-31'
             ) as lastPresentDate,
             (select t2.present
              from t t2
              where t2.name = t.name and
                    t2.date = adddate(t.date, 1)
              order by t2.date
              limit 1
             ) as TomorrowPresent
      from t
      where date between '2013-07-01' and '2013-07-31'
     ) t
where Present = 0 and (TomorrowPresent = 1 and TomorrowPresent is null)
group by name
于 2013-07-14T16:39:13.560 に答える
0

テストされていませんが、次のようなユーザー変数を使用できます:-

SELECT SUM(if(ConsCounter=10, 1, 0))
FROM
(
    SELECT id, name, date, present, @Counter := IF(@PrevPresent = present AND present = 0, @Counter + 1, 0) AS ConsCounter, @PrevPresent = present
    FROM
    (
        SELECT id, name, date, present
        FROM `table`
        ORDER BY date
    ) Sub1
    CROSS JOIN (SELECT @PrevPresent:=-99999, @Counter:=0) Sub2
) Sub4

すべてのレコードを日付順に取得し、現在が最初の 0 だったので、カウントのシーケンス番号を追加します。次に、カウンターが 10 になる回数をカウントします。

于 2013-07-14T21:15:56.503 に答える
0

このクエリは、10 または 10 より大きい場合にのみカウントを返します。

SELECT COUNT(`name`) as `count`
FROM `table`
WHERE (`present` = 0)
AND (`date` BETWEEN '2013-07-01' AND '2013-07-31')
HAVING `count` >= 10;

それが役に立てば幸い!

于 2013-07-14T17:04:59.383 に答える