2016-09-02 3 views
-1

У меня есть база данных для моей футбольной команды с 6-мя оттисками, которая вернулась на 10 лет, что вполне нормализовано, поэтому я могу вытащить из нее множество статистических данных для игроков, например, количество игр, забитых голов, среднее количество очков за игру игроком и т. д. Я хочу добавить новую статистику для последовательностей, например, самый длинный пробег последовательных чистых листов для вратарей, самый продолжительный побег подряд в команде, самый длинный забег в последующих играх и т. д. Важный таблицы - это «светильники» (содержащие, среди прочего, fixtureid, scorefor, scoreagainst) и «играемые» (содержащие, среди прочих, playerid, fixtureid, goalscored). Таким образом, чтобы увидеть, кто забивал в приспособлении 128 Я хотел бы использоватьПоследовательность результатов из MySql Таблица

SELECT playerid, goalsscored 
FROM played p 
WHERE p.fixtureid = 128 AND goalsscored > 0 

Так как я бы сформировать показ запроса, который игрок забил в большинстве игр подряд, например, Алекс (playerid 15) забил в 6 игр подряд (fixtureid 126-132) и Дэйв (игрок 12) забил в 5 играх подряд (fixtureid 130-135)? Первоначально мы можем предположить, что fixtureid является последовательным без разрывов и является порядком, в котором играли игры. Я использовал Sql довольно долго, но в тупике от этого, и я не могу найти какие-либо подобные вопросы, заданные раньше. В ответ на запрос дополнительной информации я добавил диаграмму EER. enter image description here

+0

Вы можете показать нам структуру ваших таблиц. – Martin

+1

Как идут «последовательные» игры? являются ли они последовательными по дате или идентификатором игры в таблице? Как процесс узнает, что любые две игры последовательны? – Martin

+0

Итак, есть только две команды? – Strawberry

ответ

0

Вот как это сделать в коде.

Create an List of keyvalue pairs 'CompletedSequences' - key=playerid, value=consecutivagamesscored 
Create a similar List of keyvalue pairs 'CurrentSequences' 
Select the list of fixtures ordered by date, omitting postponed 
For each fixtureid { 
    For each kv pair in CurrentSequences { 
     If playerid didn't score in this fixture { /* End of sequence for this kv */ 
      Add kv pair to CompletedSequences if count > 1 /* Only bother saving those with at least 2 in a sequence */ 
      Remove kv pair from CurrentSequences 
     } 
    For each scorer in this fixture { 
     If playerid key exists in CurrentSequences increment count /* Add 1 to sequence */ 
     else create new CurrentSequences kv pair with playerid/1 /* Create new start of sequence for this player */ 
    } 
For each kv pair in CurrenSequences /* Finish off the ones left unterminated */ 
    Add kv pair to CompletedSequences if value > 1 
Sort CompletedSequencies by value (consecutive games scored) 
Make a table of the top 10 sequences with player/count of consecutive games scored. 

Я не могу избавиться от ощущения, что какой-то умный SQL скрипт будет делать это лучше, и я предпочел бы не иметь сосать весь результирующий в памяти, чтобы сделать это в PHP, если я могу избежать этого. Думаю, я сделаю так, если в MySQL нет способа.

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