2011-11-04 22 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 

tôi cần tìm ra tuần max liên tiếp các catch = 1 và max tuần liên tiếp các catch = 0 cho mỗi người dùng (tất cả). Tôi hy vọng tôi làm cho bản thân mình rõ ràng.Tìm max không các hồ sơ liên tiếp

Trong bảng trên

max bắt liên tiếp = 1 cho người dùng 6 là (tuần 3,4,5)

max liên tiếp tuần bắt = 0 cho người sử dụng 6 là (tuần 6,7 và/hoặc tuần 9,10)

Làm thế nào để tôi tiếp tục. Tôi có thể làm điều này trong hoàn toàn sql. Một giải pháp php cũng được chào đón

Trả lời

3

này nên làm việc cho một giải pháp SQL. Mặc dù nó sẽ chỉ bao giờ cung cấp cho bạn một week_id cho catch_id trong câu hỏi. Tôi không biết những gì bảng của bạn được gọi vì vậy tôi đã gọi nó là consecutive trong câu trả lời dưới đây:

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; 

Bạn có thể sử dụng cùng một truy vấn để có được week_ids max liên tiếp với catch_id = 0 bằng cách thay đổi where catch_id = 1-where catch_id = 0.

Chúc may mắn!

+0

truy vấn của bạn không hoạt động. chỉ cần chạy nó và xem – aWebDeveloper

+0

lời xin lỗi. Typo trong một bí danh. Tôi đã chỉnh sửa câu trả lời của mình. –

1

Nếu PHP là ok, tôi sẽ làm điều đó thẳng về phía trước:

  • Lấy tất cả các mục có đánh bắt = x (x là 0 hoặc 1, tùy thuộc vào những gì bạn muốn để tính toán) theo thứ tự ASC của week_id
  • Duyệt qua các mục:
    • Kiểm tra xem có một khoảng cách trong week_id
    • cập nhật tối đa
0

Tôi chưa thử mã, nhưng nó sẽ hoạt động; một chút tinh chỉnh có thể được yêu cầu.

Sử dụng SQL và nhận được tất cả các hàng sắp xếp theo 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

Đây là giải pháp PHP. Tôi đã thử nghiệm trên đèn của tôi và nó sẽ hoạt động.

/* 
    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

Viết một truy vấn và nhận được một mảng gọi là dữ liệu định dạng tuần = catch (quan trọng là tuần và bắt là giá trị)

$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; 

Bây giờ tính toán max() của mỗi $ streak [0]$ streak [1]

Các vấn đề liên quan