假設我有一個類似ID,NAME,SCORE的表。現在通常,爲了獲得團隊的排名,我會選擇所有並排序。有時候,我不想知道所有的排名,只是一個團隊的排名。如果我添加了列RANK,有沒有辦法讓MySQL根據SCORE自動填入這些值? (我相信MS Excel有這種能力)自動化MySQL字段(如Excel)
如果是這樣,它如何處理關係?
感謝
假設我有一個類似ID,NAME,SCORE的表。現在通常,爲了獲得團隊的排名,我會選擇所有並排序。有時候,我不想知道所有的排名,只是一個團隊的排名。如果我添加了列RANK,有沒有辦法讓MySQL根據SCORE自動填入這些值? (我相信MS Excel有這種能力)自動化MySQL字段(如Excel)
如果是這樣,它如何處理關係?
感謝
可以計算排名時,你讓你的查詢:
SELECT * FROM (
SELECT teams.*, @rownum := @rownum + 1 AS rank
FROM teams, (SELECT @rownum := 0) T1
ORDER BY score DESC) T2
WHERE id = 1
它通過初始化一個名爲ROWNUM變量0,然後按照降低分數的順序遍歷行。對於每個隊伍來說,rownum會增加,隊伍會根據rownum的當前值進行排名。外部選擇應用了一個where子句,以便只返回一行。
這裏是一個改進版本,分配相同的排名,以團隊已追平比分:
SELECT id, name, teams.score, rank FROM (
SELECT score, @rownum := @rownum + 1 AS rank
FROM (SELECT DISTINCT(score) FROM teams) T1, (SELECT @rownum := 0) T2
ORDER BY score DESC) T3
JOIN teams ON T3.score = teams.score
如果這是不夠快你,然後使用觸發器來代替。
看起來像我在尋找一個MySQL觸發
獲取所有團隊:
SELECT
s1.name,
s1.score,
COUNT(s2.name) + 1 AS rank
FROM scores s1
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score)
GROUP BY s1.name
ORDER BY COUNT(s2.name)
獲取一個團隊( '加人隊'):
SELECT
s1.name,
s1.score,
COUNT(s2.name) + 1 AS rank
FROM scores s1
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score)
GROUP BY s1.name
HAVING s1.name = 'The Canucks'
ORDER BY COUNT(s2.name)
在上面的例子中所示的方法拿到名次動態地(而不是填充常規或臨時表) 。
注意:這兩種假定給定的團隊在等級值中僅存在一次纔是正確的。
這看起來很酷,但我不明白。你能解釋一下嗎?另外,不幸的是,我試着運行它,它只給了我#1隊? – 2010-01-14 22:53:55
我已經給答案添加了一些解釋。如果您想要其他團隊,請嘗試將「WHERE id = 1」更改爲其他內容。 – 2010-01-14 23:11:19