我有这个名为results的表:
+----+--------+---------+-----------+
| id | result | user_id | odd_value |
+----+--------+---------+-----------+
| 1 | 1 | 100 | 2.5 |
| 2 | 1 | 100 | 2 |
| 3 | 1 | 100 | 1 |
| 4 | 1 | 100 | 3 |
| 5 | 1 | 100 | 1 |
| 6 | 1 | 100 | 2.1 |
| 7 | 1 | 100 | 3.5 |
| 8 | 1 | 100 | 1.8 |
| 9 | 1 | 100 | 1.6 |
| 10 | 1 | 100 | 2.5 |
| 11 | 1 | 100 | 1.8 |
| 12 | 1 | 100 | 1.2 |
| 13 | 1 | 100 | 2.2 |
| 14 | 1 | 200 | 3 |
| 15 | 1 | 200 | 4.1 |
| 16 | 1 | 200 | 2.5 |
| 17 | 1 | 200 | 1.5 |
| 18 | 1 | 200 | 1.2 |
| 19 | 1 | 200 | 6 |
| 20 | 1 | 200 | 3.1 |
| 21 | 1 | 200 | 2.9 |
| 22 | 1 | 300 | 2.2 |
| 23 | 1 | 300 | 2 |
| 24 | 1 | 300 | 3 |
| 25 | 1 | 300 | 2.1 |
| 26 | 1 | 300 | 2.7 |
| 27 | 1 | 300 | 2.3 |
| 28 | 1 | 300 | 2.1 |
| 29 | 1 | 300 | 3 |
| 30 | 1 | 300 | 3.4 |
| 31 | 1 | 300 | 2.1 |
| 32 | 1 | 300 | 1.7 |
| 33 | 1 | 300 | 3 |
| 34 | 1 | 300 | 4.2 |
| 35 | 1 | 300 | 2.2 |
+----+--------+---------+-----------+
我使用此查询从此表中获取了一些信息:
SELECT
user_id,SUM(CASE WHEN F1=5 THEN 1 ELSE 0 END) AS bonus
FROM
(
SELECT
user_id,
CASE WHEN result=1 and @counter<5 THEN @counter:=@counter+1 WHEN result=1 and @counter=5 THEN @counter:=1 ELSE @counter:=0 END AS F1
FROM odds o
cross join (SELECT @counter:=0) AS t
) Temp
group by user_id
我使用前面的查询为每五个连续奖金的奖金变量添加1(胜利意味着结果= 1)。
所以对于每个条纹(1,1,1,1,1),我在bonus
变量中添加一个,然后按user_id
对它们进行分组,得到每个用户的bonus
。< / p>
我得到了查询结果和上面的数据:
+---------+-------+
| user_id | bonus |
+---------+-------+
| 100 | 2 |
| 200 | 2 |
| 300 | 3 |
+---------+-------+
这些是user_id=200
和user_id=300
的错误结果,因为:
对于user_id = 200,只有8个奖金,所以奖金应为1(因为它只有一条连线)。
对于user_id = 300,只有14个奖金,所以奖金应该是2(因为它只有两条连线)。
答案 0 :(得分:0)
我不确定您的结果与matches
表,
如果需要,您可以添加WHERE
/ INNER JOIN
子句。
这是一个查询:
SET @user:=0;
select d.user_id,
sum(case when d.result = 1 then 1 else 0 end) as winnings,
sum(case when d.result = 2 then 1 else 0 end) as loses,
sum(case when d.result = 1 then d.odd_value else 0 end) as points,
f.bonus
FROM odds d
INNER JOIN
(
SELECT
user_id,SUM(bonus) AS bonus
FROM
(
SELECT
user_id,
CASE WHEN result=1 and @counter<5 AND @user=user_id THEN @counter:=@counter+1
WHEN result=1 and @counter=5 AND @user=user_id THEN @counter:=1
WHEN result=1 and @user<>user_id THEN @counter:=1
ELSE
@counter:=0
END AS F1,
@user:=user_id,
CASE WHEN @counter=5 THEN 1 ELSE 0 END AS bonus
FROM odds o
ORDER BY user_id
) Temp
group by user_id
)as f on f.user_id = d.user_id
group by d.user_id