2011-11-04 12 views
6
 
id || week_id || user_id || catch_id(0,1,2) 
1 || 2  || 6  || 0 
1 || 3  || 6  || 1 
1 || 4  || 6  || 1 
1 || 5  || 6  || 1 
1 || 6  || 6  || 0 
1 || 7  || 6  || 0 
1 || 8  || 6  || 2 
1 || 9  || 6  || 0 
1 || 10  || 6  || 0 
1 || 11  || 6  || 1 

の検索私は、各ユーザ(すべて見つける)のために最大週連続catch = 1とmax週連続catch = 0を見つける必要があります。私は自分自身を明確にすることを望む。上記の表に連続したレコードのない最大

最大連続キャッチ= 1ユーザ6ユーザ6 (週3,4,5)

最大週連続キャッチ= 0 です(週6,7および/または週9,10)

どうすればいいですか?私は純粋なSQLでこれを行うことはできますか? PHPソリューションは、PHPがOKであれば、私はまっすぐにそれを行うだろう

答えて

3

によってソートされたすべての行を取得します。問題のcatch_idには1週間idだけが与えられます。

drop table if exists consecutive; 

create table consecutive 
(id int,week_id int,user_id int,catch_id int); 

insert into consecutive values (1,2,6,0); 
insert into consecutive values (1,3,6,1); 
insert into consecutive values (1,4,6,1); 
insert into consecutive values (1,5,6,1); 
insert into consecutive values (1,6,6,0); 
insert into consecutive values (1,7,6,0); 
insert into consecutive values (1,8,6,2); 
insert into consecutive values (1,9,6,0); 
insert into consecutive values (1,10,6,0); 
insert into consecutive values (1,11,6,1); 

select w,count(*) as max_consecutive_weeks 
from 
(
select 
case when @cur_catch_id != catch_id then @cur_week_id := week_id else @cur_week_id end as w, 
@cur_catch_id := catch_id as catchChange, 
c.* 
from consecutive c 
cross join (select @cur_catch_id := -1,@cur_week_id := -1) t 
where user_id = 6 
order by week_id asc 
) t 
where catch_id = 1 
group by w 
order by max_consecutive_weeks desc,w asc 
limit 1; 

あなたはwhere catch_id = 0where catch_id = 1を変更することにより、catch_id = 0で最大の連続week_idsを取得するために、同じクエリを使用することができます。私は以下の回答でそれconsecutiveと呼ばれてきたので、私はあなたのテーブルが呼び出されるかわかりません。

幸運を祈る!

+0

あなたのお問い合わせがうまくいきません。それを実行し、 – aWebDeveloper

+0

謝罪を参照してください。別名の入力ミス。私は自分の答えを編集しました。 –

1

を歓迎します

  • はキャッチ= xを持つすべてのアイテムを取得する(あなたが計算したいものに応じて、0または1であることX)アイテムスルーweek_id
  • 反復のASCの順に: 最大week_id
  • 更新にギャップがあるかどうか
    • チェック
0

私はコードを試していませんが、うまくいくはずです。多少の調整が必要かもしれません。

使用SQLとこれはSQLソリューションのために働く必要がありますweek_id

$currentcatch = ''; 
$run = 0; 
$results = array(); 

while($record) { 
    if ($record['catch_id'] == $currentcatch) { 
     $run++; 
    } else { 
     if (!empty($currentcatch)) { 
     if (empty($results[$currentcatch]) { 
      $results[$currentcatch] = $run; 
     } else { 
      if ($results[$currentcatch] < $run) { 
       $results[$currentcatch] = $run; 
      } 
     } 
     } 

     $run = 1; 
     $currentcatch = $record['catch_id']; 
    } 
} 

print_r($results); 
0

ここにPHPのソリューションがあります。私のランプでテストしたところ、うまくいくはずです。

/* 
    steps: 
    1.sort the week_ids 
    2.iterate the sorted week_ids and try to get all possible max numbers of consecutive records 
    3.show the greatest one. 

*/ 
$numstr = array(4,2,5,6,7,1); //sample week_ids,should be fetched from db by catch_id 
sort($numstr); 
$int_max = 1; 
$maxs_array = array(); 
for($i=0;$i<sizeof($numstr);$i++) 
{ 
    $k = $i; 
    while($numstr[$k]) 
    { 
     if($numstr[$k+1] && $numstr[$k+1] == $numstr[$k]+1) //duplicate week_ids not considered yet 
     { 
      $int_max ++; 
     } 
     else 
     { 
      array_push($maxs_array,$int_max); 
      $int_max = 1; 
      continue 2; 
      } 
      $k++; 
    } 
} 
sort($maxs_array); 
echo array_pop($maxs_array); //output 4 
1

は、クエリを書くと、配列は、フォーマット週=漁獲量のデータと呼ば取得(キーは一週間で、キャッチが値である)

$streak = array(); 
$WeekId = 0; 
$prev = 0; 
$count = 1; 
foreach ($data as $week => $catch) 
{ 
    if($week == ++$WeekId && $prev == $catch) 
    { 
     $count ++; 
     $WeekId = $week; 
    } 
    else 
    { 
     if($prev !== 0) 
     { 
      $streak[$prev][$count]  = $count; 
     } 
     $WeekId      = $week;  
     $count      = 1; 
     $prev      = $catch; 

    } 
} 
$streak[$prev][$count]  = $count; 

は今(最大を計算する)各$ストリークの[0]$ streak [1]

関連する問題