我在列出了一個列表中列出了遊戲中的優勝者。 我試圖找到一個查詢,將返回每個球員贏得時間最長的運行。 或用php解釋查詢的方法。mysql查詢找到列中最長的運行
在這種情況下,將 凱特4, 埃德1, 麥克2, 哈里1,
**Winner**
Kate
Kate
Ed
Harry
Ed
Harry
Mike
Mike
Ed
Harry
Kate
Kate
Kate
Kate
Ed
道歉提前,因爲我很新的這一切。
我在列出了一個列表中列出了遊戲中的優勝者。 我試圖找到一個查詢,將返回每個球員贏得時間最長的運行。 或用php解釋查詢的方法。mysql查詢找到列中最長的運行
在這種情況下,將 凱特4, 埃德1, 麥克2, 哈里1,
**Winner**
Kate
Kate
Ed
Harry
Ed
Harry
Mike
Mike
Ed
Harry
Kate
Kate
Kate
Kate
Ed
道歉提前,因爲我很新的這一切。
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。
很酷。我從來不知道一個sqlfiddle存在! – 2013-04-04 15:41:37
不錯。我敢打賭,這個查詢也很好。 – Strawberry 2013-04-04 15:49:15
使用變量會使查詢變得更加簡單,但我想用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沒有差距。
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;
在PHP很簡單。選擇獲勝者,獲取行數,並在循環中保持計數。在sql中,它很醜陋。 – 2013-04-04 15:11:17
你的表中是否有ID或時間戳?你如何訂購行? – fthiella 2013-04-04 15:27:48
您需要一個主鍵。之後,這是一個輕而易舉的事情。 – Strawberry 2013-04-04 15:32:32