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

时间:2015-02-26 14:31:23

标签: mysql sql group-by subquery aggregate-functions

我有这个名为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=200user_id=300的错误结果,因为:

对于user_id = 200,只有8个奖金,所以奖金应为1(因为它只有一条连线)。

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

1 个答案:

答案 0 :(得分:0)

我不确定您的结果与matches表,

有何关联

如果需要,您可以添加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