У меня есть структура таблицы следующим образом
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
Я хочу получить последовательные выигрыши (win = 1) для каждого пользователя в mysql.like для user_id = 1, он должен вернуть 4 (идентификатор записи 10,11,12,13), для user_id = 2 (запись id = 5), он должен вернуть 1.
Я могу сделать это в php после восстановления записи для каждого пользователя, но я не знаю, как это сделать, используя запрос к mysql.
Также было бы лучше с точки зрения производительности, используя php или mysql. Любая помощь будет оценена. Спасибо !!!
Не уверен, что вам удалось заставить другой запрос работать, но вот моя попытка, определенно работающая – Sqlfiddle, чтобы это доказать.
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:=@y+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
Как заставить его работать на странице PHP и тестировать, чтобы увидеть правильные результаты, я также немного оптимизировал запрос:
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:=@y+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);}
в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:=@y+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);}
Внутренний запрос подсчитывает каждую полосу. Внешний запрос получает максимум для каждого пользователя. Запрос не проверен (но основан на том, что работает)
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