MySQL选择自和>;=3.

MySQL选择自和>;=3.,mysql,Mysql,表: 我需要选择SUM(CASE WHEN event='+1'然后1 ELSE 0 END)因为SUM(CASE WHEN event='pt'然后1 ELSE 0 END)=3 我试过这个: +++++++++++++++++++++++++ + id | event | group_id + + 1 | '+1' | 1 + + 2 | 'pt' | 1 + + 3 | 'pt' | 1 + + 4 | '+1' |

表:

我需要选择
SUM(CASE WHEN event='+1'然后1 ELSE 0 END)
因为
SUM(CASE WHEN event='pt'然后1 ELSE 0 END)=3

我试过这个:

+++++++++++++++++++++++++
+ id | event | group_id +
+  1 |  '+1' |        1 +
+  2 |  'pt' |        1 +
+  3 |  'pt' |        1 +
+  4 |  '+1' |        1 +
+  5 |  'pt' |        1 +
+  6 |  '+1' |        1 +
+  7 |  'pt' |        1 +
+  8 |  '+1' |        1 +
+++++++++++++++++++++++++
但这不是组函数的工作方式,所以我如何实现这个输出呢?当条件
SUM(事件='pt'然后1 ELSE 0 END)=3
为真时,是否需要使用用户变量来选择id?我相信这是可能的,没有用户变量,这是可能的吗

期望输出:

SELECT group_id, SUM(CASE WHEN event = '+1' THEN 1 ELSE 0 END) AS event_sum
FROM Table
WHERE SUM(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) >= 3
ORDER BY id
GROUP BY group_id

您需要所有+1事件的数量,因为您至少获得3个“pt”事件

对于'since',我猜您希望按ID排序事件

对于pt,您需要一个运行总数。为了在MySQL中实现这一点,有几个关于堆栈溢出的答案(只有一个)

但您希望在每次更改groupid时重置计数,因此:

SET @pts:=0;
SELECT
   *,
   (@pts := @pts + (CASE WHEN event='pt' THEN 1 ELSE 0)) AS pts
FROM Table 
ORDER BY id;
因此,在每个循环中保存当前的groupid值,但在执行此操作之前,请检查它是否相同。如果不是,那么您可以将pts计数设为零

SET @pts:=0,@gid:=-1;
SELECT *,
    (@pts := IF (@gid != groupid, 0, @pts + IF(event='pt', 1, 0))) AS pts, 
    @gid:=groupid
FROM eventi ORDER BY groupid, id;
从这里可以看到,实际pts’的数量减少了1(检查的顺序与增量相反)

现在您可以进行分组:

+------+-------+---------+------+---------------+
| id   | event | groupid | pts  | @gid:=groupid |
+------+-------+---------+------+---------------+
|    1 | pt    |       1 |    0 |             1 |
|    2 | pt    |       1 |    1 |             1 |
|    3 | +1    |       1 |    1 |             1 |
|    4 | pt    |       1 |    2 |             1 |
|    5 | +1    |       1 |    2 |             1 |
|    6 | +1    |       1 |    2 |             1 |
|    7 | pt    |       2 |    0 |             2 |
|    8 | pt    |       2 |    1 |             2 |
|    9 | +1    |       2 |    1 |             2 |
|   10 | pt    |       2 |    2 |             2 |
|   11 | +1    |       2 |    2 |             2 |
|   12 | +1    |       2 |    2 |             2 |
+------+-------+---------+------+---------------+
也可以在同一查询中合并集合:

SET @pts:=0,@gid:=-1; 
SELECT groupid, SUM(IF(pts >= 3 AND event='+1', 1,0)) AS event_sum FROM (
    SELECT *,
       (@pts := IF(@gid!=groupid, 0, @pts+IF(event='pt',1,0)))+1 AS pts,
       @gid:=groupid
    FROM eventi ORDER BY groupid, id 
) AS a GROUP BY groupid;


+---------+-----------+
| groupid | event_sum |
+---------+-----------+
|       1 |         2 |
|       2 |         2 |
+---------+-----------+

这是一个。

首先求和,其中event=pt标记为temp表,然后从temp中选择并计数,其中event>=3
SET @pts:=0,@gid:=-1; 
SELECT groupid, SUM(IF(pts >= 3 AND event='+1', 1,0)) AS event_sum FROM (
    SELECT *,
       (@pts := IF(@gid!=groupid, 0, @pts+IF(event='pt',1,0)))+1 AS pts,
       @gid:=groupid
    FROM eventi ORDER BY groupid, id 
) AS a GROUP BY groupid;


+---------+-----------+
| groupid | event_sum |
+---------+-----------+
|       1 |         2 |
|       2 |         2 |
+---------+-----------+
SELECT ...  AS a, (SELECT @pts:=0,@gid:=-1) AS i GROUP BY groupid;