gpt4 book ai didi

mysql - 如何从使用用户变量作为计数器的查询中获得正确的结果?

转载 作者:行者123 更新时间:2023-11-30 22:48:51 25 4
gpt4 key购买 nike

我有一张名为结果的表格:

+----+--------+---------+-----------+
| 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

我使用前面的查询为每五次连续获胜(win 意味着 result=1)将 1 加到 bonus 变量。所以对于每个连胜 (1,1,1,1,1),我将一个添加到 bonus 变量,然后我将它们按 user_id 分组以获得 bonus 为每个用户。

我得到了这个查询结果和上面的数据:

+---------+-------+
| user_id | bonus |
+---------+-------+
| 100 | 2 |
| 200 | 2 |
| 300 | 3 |
+---------+-------+

user_id=200user_id=300 的结果是错误的,因为:

对于 user_id = 200,只有 8 次获胜,所以奖金应该是 1(因为它只有一次连胜)。

对于 user_id = 300,只有 14 次获胜,所以奖金应该是 2(因为它只有两连胜)。

最佳答案

我不确定你的结果如何与匹配表相关,

如果需要,您可以添加 WHERE/INNER JOIN 子句。

这里是 link to fiddle

这是一个查询:

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

关于mysql - 如何从使用用户变量作为计数器的查询中获得正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com