2013-04-04 2 views
1

У меня есть столбец в таблице mysql, в котором перечислены победители из игры. Я пытаюсь найти запрос, который вернет самый длинный выигрыш для каждого игрока. Или способ интерпретировать запрос с помощью php.mysql запрос, чтобы найти самый длинный пробег в столбце

В этом случае было бы Кейт 4, Ed 1, Mike 2, Гарри 1,

**Winner** 
Kate 
Kate 
Ed 
Harry 
Ed 
Harry 
Mike 
Mike 
Ed 
Harry 
Kate  
Kate 
Kate 
Kate 
Ed 

Извинения заранее, так как я очень новой для всего этого.

+2

в PHP это просто. выберите победителей, извлеките строки и сохраните счетчик в виде цикла. в sql, это намного уродливее. –

+0

У вас есть идентификатор или временная метка в вашем столе? как вы можете заказать строки? – fthiella

+0

Вам нужен первичный ключ. После этого это пустяк. – Strawberry

ответ

6
SELECT winner, MAX(winningStreak) FROM (
SELECT 
winner, 
IF([email protected], @rownum:[email protected]+1, @rownum:=1) AS winningStreak, 
@prev:=winner 
FROM 
yourTable 
, (SELECT @prev:=NULL, @rownum:=1) vars 
/*ORDER BY whateverDeterminesTheOrderOfTheWinners*/ 
)sq 
GROUP BY winner 
ORDER BY winningStreak DESC 

Вам нужен другой столбец, который определяет порядок победителей, как вы их перечислили, и отрегулируйте выведенную часть запроса. Кроме того, этот запрос работает, но в PHP это будет проще сделать.

Посмотрите это в прямом эфире here.

+1

Прохладный. Я никогда не знал, что sqlfiddle существует! –

+0

Ницца. Бьюсь об заклад, этот запрос тоже хорошо масштабируется. – Strawberry

2

Использование переменных сделает запрос более простым, но я хотел его решить, используя только SQL. Это мой вопрос:

SELECT winner, COALESCE(MAX(id2-min_id1), 0)+1 
FROM (
    SELECT MIN(w1.id) min_id1, w1.winner, w2.id id2 
    FROM 
    winners w1 LEFT JOIN winners w2 
    ON w1.id < w2.id 
     AND w1.winner = w2.winner 
    WHERE 
    NOT EXISTS (SELECT NULL FROM winners w3 
       WHERE w3.winner != w1.winner 
         AND w3.id > w1.id AND w3.id < w2.id) 
    GROUP BY 
    w2.id, w1.winner 
) s 
GROUP BY 
    winner 

См. Скрипку here. Я использую идентификатор, потому что без идентификатора или временной метки порядок строк, возвращаемых SQL-запросом, не может быть определен. Это предполагает, что идентификатор не имеет пробелов.

1

OK, моя очередь ... это предполагает, что идентификатор auto_incrementing без пробелов ...

SELECT winner 
    , MAX(streak) longest_streak 
    FROM 
    (SELECT a.* 
      , MIN(c.id) - a.id + 1 streak 
     FROM results a 
     LEFT 
     JOIN results b 
      ON a.id = b.id + 1 
      AND b.winner = a.winner 
     LEFT 
     JOIN results c 
      ON a.id <= c.id 
      AND c.winner = a.winner 
     LEFT 
     JOIN results d 
      ON c.id = d.id - 1 
      AND d.winner = a.winner 
     WHERE b.id IS NULL 
      AND c.id IS NOT NULL 
      AND d.id IS NULL 
     GROUP 
      BY a.id 
    ) x 
GROUP 
    BY winner 
ORDER 
    BY longest_streak DESC; 
Смежные вопросы