2013-04-04 29 views
1

我在列出了一個列表中列出了遊戲中的優勝者。 我試圖找到一個查詢,將返回每個球員贏得時間最長的運行。 或用php解釋查詢的方法。mysql查詢找到列中最長的運行

在這種情況下,將 凱特4, 埃德1, 麥克2, 哈里1,

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

道歉提前,因爲我很新的這一切。

+2

在PHP很簡單。選擇獲勝者,獲取行數,並在循環中保持計數。在sql中,它很醜陋。 – 2013-04-04 15:11:17

+0

你的表中是否有ID或時間戳?你如何訂購行? – fthiella 2013-04-04 15:27:48

+0

您需要一個主鍵。之後,這是一個輕而易舉的事情。 – Strawberry 2013-04-04 15:32:32

回答

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存在! – 2013-04-04 15:41:37

+0

不錯。我敢打賭,這個查詢也很好。 – Strawberry 2013-04-04 15:49:15

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。我使用的是ID,因爲沒有ID或時間戳,無法確定SQL查詢返回的行的順序。這假定ID沒有差距。

1

OK,輪到我......這是假定ID與無間隙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;