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

标签 mysql sql group-by subquery aggregate-functions

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

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

相关文章:

php 表单未将日期发送到数据库 SQL

php - 从数据库中随机选择

mysql - 为什么不是所有字符都适合 MySQL 新表中的新 TEXT 字段?

mysql - 如何选择具有相同ID的行并添加其字段值

mysql - SELECT IF 行到多列

python - 如何使用 GroupBy.agg() 从 TimeSeries 数据中获取 'Start' 和 'End'?

php - PHP 不工作时输出 MySQL 查询的单个结果

SQL Server - 架构/代码分析规则 - 您的规则将包括哪些内容?

mysql - 我在下表之间建立了多对多关系,我做得对吗?其次我想要对他们进行联接查询

mysql - SQL从连接中选择计数返回0而不是空结果