2017-03-06 52 views
0

列的變化值我有同樣的問題,想在這個問題Count rows until value in column changes mysql 不過,儘管問題就解決了我不明白這個查詢。因爲我的信譽低,所以我不能在那裏發表評論,並且必須提出新的問題。計數行,直到在MySQL的

我的例子:

mysql> select * from example; 
+----+-------+------+ 
| id | name | succ | 
+----+-------+------+ 
| 1 | peter | 1 | 
| 2 | bob | 1 | 
| 3 | peter | 0 | 
| 4 | peter | 0 | 
| 5 | nick | 1 | 
| 6 | bob | 0 | 
| 7 | peter | 1 | 
| 8 | bob | 0 | 
| 9 | peter | 1 | 
| 10 | peter | 1 | 
+----+-------+------+ 
10 rows in set (0.00 sec) 

我要爲彼得count個連續真值(降序ID和結果必須爲3),我知道如何設置這樣的查詢:

mysql> select count(succ) 
     from example 
     where id > (select max(id) from example where succ = 0); 
+-------------+ 
| count(succ) | 
+-------------+ 
|   2 | 
+-------------+ 
1 row in set (0.00 sec) 

但如何得到結果只是爲了彼得,如果有可能得到結果按名稱分組,如下所示:

+--------+------+ 
    |name | succ | 
    +--------+------+ 
    | peter | 3 | 
    | bob | 0 | 
    | nick | 1 | 
    +--------+------+ 
+0

你需要自上次失敗後每個人連續獲得成功嗎? –

回答

0

使用變量來計算連續成功(見到了故障時,重新開始),並用它選擇每名最高ID(有點類似McNets的聯接的查詢回答)

SELECT a.name, a.count FROM ( 
    SELECT e1.id, e1.name, e1.succ, 
    @count_success := IF (@prev_name = e1.name AND e1.succ = 1, @count_success + 1, e1.succ) AS `count`, 
    @prev_name := e1.name AS `prev_name` 
    FROM `example` e1, (SELECT @count_success :=0, @prev_name := NULL) init 
    ORDER BY e1.name, e1.id) `a` 
    JOIN (SELECT MAX(id) AS `max` FROM `example` GROUP BY `name`) `b` ON a.id = b.max 
+0

這段代碼也給了我正確的結果,但艾克沃克的答案更簡單。也感謝你的代碼。 – Kova

+0

剛纔我比較你和Ike Walker在我的真正數據庫表上的答案,它有大約12000行和大約800個不同的名字。對於Ike Walker的代碼mysql需要2分34秒,你的時間需要0.19秒。所以,你的代碼更快得多 – Kova

+0

是,艾克的解決方案進行產品的笛卡爾積與自身,礦山只有每名最高的ID連接。樂於幫助 :) –

0

如果需要記錄

select name, count(succ) from example group by name 

或計數,如果你需要每個人的SUCC的總和,你可以使用

select name, sum(succ) from example group by name 
1

一種方法來解決,這是一個自連接。使用外連接你排除有值更高的ID和succ = 0匹配的行,然後用SUM()CASEsucc = 1計算行數行。

下面是你的榜樣查詢:

select e1.name, 
    sum(case when e1.succ = 1 then 1 else 0 end) as succ 
from example e1 
left outer join example e2 on e2.id > e1.id 
    and e2.name = e1.name 
    and e2.succ = 0 
where e2.id is null 
group by e1.name 
+0

是的,就是這樣。非常感謝你。 – Kova