2011-04-13 9 views
1

に基づいて見つけ、次のとおりです。私は失敗したtry次成功しました(少なくとも)を持っていた人1 tryは、(10で与えたいSQL:私のようなテーブルを持っている、以前のID

mysql> select * from tries; 
+----+--------+-----------+ 
| id | person | succeeded | 
+----+--------+-----------+ 
| 1 |  1 |   1 | 
| 2 |  1 |   1 | 
| 3 |  2 |   0 | 
| 4 |  4 |   1 | 
| 5 |  2 |   1 | 
| 6 |  2 |   0 | 
| 7 |  3 |   0 | 
| 8 |  3 |   0 | 
| 9 |  3 |   0 | 
| 10 |  1 |   0 | 
| 11 |  4 |   1 | 
| 12 |  4 |   1 | 
+----+--------+-----------+ 

、それぞれ)。私が「フォロー」と言うとき、私は同じ人による以前の試みを意味し、より低い数字はidです。したがって、この場合の

  • 人2がid = 5に成功した、とid = 3に失敗し、その人の以前の試みは、これ基準を満たしています。
  • 人1は、このような基準を失敗し、これ
  • 人4は何の障害を持っていない基準を失敗し、これ
  • 人3は何の成功を持っていない基準を失敗し、すぐに故障に続く一切の成功を持っていない

方法私はそのような質問を書くだろうか?

答えて

1
SELECT t1.person, MIN(t1.id) as SuccessID 
    FROM tries t1 
    WHERE t1.succeeded = 1 
     AND t1.person IN (SELECT t2.person 
           FROM tries t2 
           WHERE t2.succeeded = 0 
            AND t2.id < t1.id) 
    GROUP BY t1.person 
+0

これは、最初の試行と最初に失敗した試行の間に2回目の試行を試みる可能性があります。 – ronaldosantana

+0

@ロナウド:私はあなたに従っているか分からない。あなたは具体的な例を挙げることができますか? –

+0

@Ronaldo:正しいですが、Joeはt1.personでグループ化しているので、最初の試行と最初の失敗試行の間に2回目の試行があると、その人物が基準を満たしているため問題ありません。 – ash

1
Select ... 
From tries As T 
    Join tries As T2 
     On T2.id = T.id + 1 
      And T2.succeeded = 0 
Where T.succeeded = 1 

我々は仮定できない場合Idsは完全に連続している:私は質問を理解して

Select ... 
From tries As T 
    Join (
      Select T1.id, Min(T2.Id) As NextId 
      From tries As T1 
       Join tries As T2 
        On T2.id > T.id 
      Group By T1.id 
      ) As TriesAndNext 
     On TriesAndNext.Id = T.Id 
    Join tries As TNext 
     On TNext.Id = TriesAndNext.NextId 
      And TNext.succeeded = 0 
Where T.succeeded = 1 
+0

IDは常にシーケンシャルではありません。 – ronaldosantana

+0

@Ronaldo Junior - このシナリオを可能にするために私の答えを修正しました。 – Thomas