2011-04-13 4 views
1

У меня есть таблица, как следует:SQL: найти на основе предыдущего идентификатора

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 что потерпел неудачу (дается 1 и 0 , соответственно). Когда я говорю «следовать», я имею в виду предыдущую попытку того же человека, заданную более низким id.

Так что в этом случае:

  • Person 2 удались на id = 5, и не на id = 3, предыдущая попытка этого человека, таким образом отвечает критериев.
  • Person 1 не имеет успеха, что сразу следуют неудачи, таким образом, не удовлетворяет критерию
  • Person 3 не имеет успеха, таким образом, не удовлетворяет критерию
  • Person 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

+0

@ Рональдо: Я не уверен, что я за тобой. Можете ли вы привести конкретный пример? –

+0

@ Ronaldo: правильно, хотя, поскольку Joe группируется t1.person, это не имеет значения, так как если есть вторая попытка попробовать между первой и первой неудачной попыткой, то человек отвечает критериям. – 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 

Если мы не можем предполагать Идентификаторы прекрасно прилегающий:

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

идентификаторы не всегда последовательным, как я понимаю вопрос. – ronaldosantana

+0

@ Ronaldo Junior - Изменили мой ответ, чтобы разрешить этот сценарий. – Thomas

Смежные вопросы