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

necesito averiguar el máximo semana consecutiva la catch = 1 y Max semana consecutiva la catch = 0 para cada usuario (Encontrar todos). Espero ser claro.Encuentra máximo ninguna de registros consecutivos

En la tabla anterior

max captura consecutivo = 1 para el usuario 6 es (semanas 3,4,5)

max semanas captura consecutivo = 0 para el usuario 6 es (semana 6,7 ​​y/o semana 9,10)

¿Cómo voy. ¿Puedo hacer esto en puramente sql. Una solución php también es bienvenido

Respuesta

3

Esto debería funcionar para una solución de SQL. Aunque solo le dará una semana_id para el catch_id en cuestión. No sé lo que su tabla se denomina así que he llamado consecutive en la respuesta a continuación:

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; 

Usted puede utilizar la misma consulta para obtener week_ids consecutivas máximas con catch_id = 0 cambiando a where catch_id = 1where catch_id = 0.

¡Buena suerte!

+0

su consulta no funciona. simplemente ejecútelo y vea – aWebDeveloper

+0

disculpas. Typo en un alias. He editado mi respuesta. –

1

Si PHP está bien, lo haría sencillo:

  • Recuperación de todos los artículos que tienen capturas = x (x es 0 ó 1, dependiendo de lo que se quiere calcular) con el fin de ASC week_id
  • Iterar a través de los artículos:
    • Comprobar si existe una brecha en week_id
    • actualización de la máxima
0

No he probado el código, pero debería funcionar; puede ser necesario un pequeño ajuste.

uso de SQL y obtener todos los registros ordenados por 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

Aquí hay una solución de PHP. Lo he probado en mi lámpara y debería funcionar.

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

escribir una consulta y obtener una matriz llamada de datos de formato de la semana = captura (clave es la semana y captura es el valor)

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

Ahora calcular el máximo() de cada $ racha [0] y $ racha [1]

Cuestiones relacionadas