2011-04-13 77 views
1

我有一个表像如下: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 | 
+----+--------+-----------+ 

我想谁的人(至少一个)try是成功的,下面有try失败(由10给出, 分别)。当我说“跟随”时,我的意思是同一个人以前的尝试,由较低的id给出。

因此,在这种情况下:

  • 2人成功上id = 5和失败的id = 3,这个人以前的尝试,从而符合的标准。
  • 人1没有成功经验,以紧跟的故障,从而不能在标准
  • 人3没有成功,因此不能标准
  • 人4没有故障,从而不能在标准

如何我会写这样一个查询吗?

回答

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

这可能会在第一次和第一次失败尝试之间尝试第二次。 – ronaldosantana 2011-04-13 20:24:06

+0

@Ronaldo:我不确定我是否关注你。你能举一个具体的例子吗? – 2011-04-13 20:28:48

+0

@Ronaldo:对,虽然由于Joe是由t1.person分组的,但这并不重要,因为如果在第一个和第一个失败尝试之间有第二个成功尝试,则该人符合标准。 – ash 2011-04-13 20:37:46

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 2011-04-13 20:23:12

+0

@Ronaldo Junior - 修改了我的答案以适应这种情况。 – Thomas 2011-04-13 20:25:20