2016-01-01 1 views
1

Хотелось бы подсчитать количество строк между событиями, где общее количество баллов выше 60, и подсчитать количество строк, где этого события не произошло. Например, 5-й и 6-й игре будет в конечном итоге с более чем 60, так отсчитает 5 строк с не 60 и 2 строки с 60Проблемные пробелы и остроты Mysql?

Я хотел бы что-то вроде этого:

type     count 
no-60-gap   5 
yes-60-island  1 
no-60-gap   3 
yes-60-island  2 

У меня есть простой база данных баскетбольных игр. Грубый пример ниже

id, home, score_home, away,  score_away, round 
1, team_1, 33,   team_2, 23,   1 
2, team_4, 31,   team_1, 33,   1 
3, team_2, 36,   team_5, 53,   2 
4, team_5, 35,   team_1, 63,   2 
5, team_7, 31,   team_8, 53,   3 
6, team_2, 30,   team_1, 43,   3 
7, team_1, 39,   team_3, 13,   4 

был Google-ING из этой проблемы, и я в конечном итоге пытается решить мою проблему с пробелами и островами.

Это мое решение, но оно не работает. Идея заключалась только в том, чтобы сбросить разрыв/остров до 0, когда этого не произошло. Я добрый новый в этом.

SET @gap :=0; SET @island :=0; 
SELECT 
@gap, 
@island 
FROM (
SELECT 
CASE 
    WHEN (score_home + score_away) >= 60 THEN @island:[email protected]+1 
    WHEN (score_home + score_away) >= 60 THEN @gap:=0 
END, 
CASE 
    WHEN (score_home + score_away) < 60 THEN @island:=0 
    WHEN (score_home + score_away) < 60 THEN @gap:[email protected]+1 
END 
FROM basket 

) AS games 

Цените помощь

+0

Мог бы вы предоставить некоторый пример вывод, чтобы соответствовать вашему вкладу? –

+0

@jeremytwfortune Все они нули. Не уверен, что мой подход хорош. – Marko321

+1

Нет, не то, что генерирует ваш код. Предоставьте то, что вы хотите *. –

ответ

0

Я полагаю, что вы после того, как что-то вроде этого ...

SELECT v,flag,COUNT(*) 
    FROM 
    (SELECT flag 
      , CASE WHEN @prev = flag THEN @v:[email protected] ELSE @v:[email protected]+1 END v 
      , @prev:=flag 
     FROM 
      (SELECT *, score_home + score_away >= 60 flag FROM my_table) x 
     JOIN 
      (SELECT @prev:=NULL,@v:=0) vars 
     ORDER 
      BY id 
    ) n 
GROUP 
    BY v,flag; 
+0

Спасибо, извините за поздний ответ, COUNT (*) - это остров, а пробел - флаг? v - только номер индекса? Я все еще немного путаюсь, как это работает, но выяснится. Tnx снова. – Marko321

+0

Удалите COUNT (*) и GROUP BY и посмотрите, что вы получаете. Это вообще помогает? – Strawberry

+0

Я не говорю, что ваш запрос не очень хорош, я просто пытаюсь понять, как он работает, и что есть, поэтому я мог бы узнать что-то новое здесь :) Я удалил его, теперь он более запутан. Таким образом, флаг, как правило, когда оценка больше 60. Не уверен, что такое v? – Marko321