2012-09-12 35 views
5

tengo estructura de la tabla de la siguiente maneraobtener registros consecutivos en MySQL

ID   user_id   win 
1    1    1 
2    1    1 
3    1    0 
4    1    1 
5    2    1 
6    2    0 
7    2    0 
8    2    1 
9    1    0 
10    1    1 
11    1    1 
12    1    1 
13    1    1 
14    3    1 

I quiere conseguir victorias consecutivas (WIN = 1) para cada uno de los usuarios en mysql.like para user_id = 1, debe devolver 4 (registro id 10,11,12,13), para user_id = 2 (registro id = 5), debería devolver 1.

Puedo hacerlo en php después de recuperar el registro para cada usuario, pero no sé cómo puede hacerlo usando la consulta a mysql.

También lo que sería mejor en términos de rendimiento, utilizando php o mysql. ¡¡¡Cualquier ayuda será apreciada, gracias!!!

+0

por qué no 1, 2,4,9? –

+0

no, ya que 1,2,4,9 no es consecutivo. El user_id = 1 pierde en record_id = 3 –

+2

así 1,2 son victorias consecutivas, ¿quieres la racha ganadora más larga? –

Respuesta

1

No estoy seguro si usted ha logrado obtener la otra consulta a trabajar, pero aquí está mi intento, sin duda trabajan - Sqlfiddle para probarlo.

set @x=null; 
set @y=0; 

select sub.user_id as user_id,max(sub.streak) as streak 
from 
(
select 
case when @x is null then @x:=user_id end, 
case 
when win=1 and @x=user_id then @y:[email protected]+1 
when win=0 and @x=user_id then @y:=0 
when win=1 and @x<>user_id then @y:=1 
when win=0 and @x<>user_id then @y:=0 
end as streak, 
@x:=user_id as user_id 
from your_table 
) as sub 
group by sub.user_id 

Cómo conseguir que funcione en una página PHP y pruebas para ver que está obteniendo los resultados correctos que hay debajo, también he optimizado la consulta un poco:

mysql_query("set @y=0"); 
$query=mysql_query("select sub.user_id as user_id,max(sub.streak) as streak 
from 
(
select 
case 
when win=1 and @x=user_id then @y:[email protected]+1 
when win=0 and @x=user_id then @y:=0 
when win=1 and @x<>user_id then @y:=1 
when win=0 and @x<>user_id then @y:=0 
end as streak, 
@x:=user_id as user_id 
from your_table 
) as sub 
group by sub.user_id"); 
while($row=mysql_fetch_assoc($query)){ 
print_r($row);} 
+0

gracias !! Funcionó. Muchas gracias :) –

+0

hola, la ejecución de esta consulta utilizando la función mysql_query en php no devuelve nada, mientras que esto funciona bien en phpmyadmin. Cualquier sugerencia para esto. Gracias –

+0

@PriteshGupta Hola, he editado mi publicación para incluir cómo lo tengo que trabajar en una página php que hice. – mrmryb

4

La consulta interna cuenta cada racha. La consulta externa obtiene el máximo por usuario. Consulta no se ha probado (pero basado en uno que funcione)

set @user_id = null; 
set @streak = 1; 

select user_id, max(streak) from (
    SELECT user_id, streak, 
    case when @user_id is null OR @user_id != user_id then @streak := 1 else @streak := @streak + 1 end as streak_formula, 
    @user_id := user_id, 
    @streak as streak 
    FROM my_table 
) foo 
group by user_id 
+0

Lo estoy probando. te lo hará saber pronto –

+0

No puedo ejecutarlo para mysql. ¿Podría explicar esto amablemente así puedo corregir las cosas que estoy haciendo mal? Reemplacé my_table por el nombre de mi tabla. ¿Hay otra cosa que deba cambiarse? –

+0

¿Qué error obtienes? ¿My_table contiene una columna llamada user_id? –

Cuestiones relacionadas