2016-10-10 6 views
1

表:sum> = 3よりMySQLを選択しますか?

+++++++++++++++++++++++++ 
+ 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(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) = 3以来SUM(CASE WHEN event = '+1' THEN 1 ELSE 0 END)を選択する必要があります。

私はこの試みた:

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 

をしかし、これはグループ機能がどのように動作するかの方法ではありませんので、どのように私はこの出力を実現するだろうか?条件SUM(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) = 3が真のときにidを選択するためにユーザー変数を使用する必要がありますか?私はそれが可能である、それはユーザー変数なしで行うことが可能だと思いますか?

所望の出力:

++++++++++++++++++++++++ 
+ group_id | event_sum + 
+  1 |   2 + 
++++++++++++++++++++++++ 
+0

ここで、イベント= ptは一時テーブルとしてマークし、イベント> = 3のtempから選択してカウントします –

答えて

1

あなたが望むすべて+1のイベント以来あなたは、少なくとも3 'PT' イベントを取得モーメントの数。

'since'の場合は、IDでイベントを注文したいと思います。

ptの場合は、合計のが必要です。これを達成するために、Stack Overflow(thisは1)に関するいくつかの答えがあります。

SET @pts:=0; 
SELECT 
    *, 
    (@pts := @pts + (CASE WHEN event='pt' THEN 1 ELSE 0)) AS pts 
FROM Table 
ORDER BY id; 

しかし、あなたはそう、カウントはグループIDの変更のたびにリセットされるようにしたい:

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; 

ですから、現在のグループID値を保存し、すべてのループでは、それはだ場合はその前に、あなたは確認してください同じ。そうでなければ、ptsカウントをゼロにします。

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

ここから、実際のptsの数は1つだけオフになっています(チェックは増分と逆の順序で行われます)。

今、あなたは、グループ化を行うことができます。

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

をあなたも、同じクエリでSETをマージすることができます

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

これはtest SQLfiddleです。

関連する問題