2010-01-14 16 views
0

假設我有一個類似ID,NAME,SCORE的表。現在通常,爲了獲得團隊的排名,我會選擇所有並排序。有時候,我不想知道所有的排名,只是一個團隊的排名。如果我添加了列RANK,有沒有辦法讓MySQL根據SCORE自動填入這些值? (我相信MS Excel有這種能力)自動化MySQL字段(如Excel)

如果是這樣,它如何處理關係?

感謝

回答

2

可以計算排名時,你讓你的查詢:

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 

如果這是不夠快你,然後使用觸發器來代替。

+0

這看起來很酷,但我不明白。你能解釋一下嗎?另外,不幸的是,我試着運行它,它只給了我#1隊? – 2010-01-14 22:53:55

+2

我已經給答案添加了一些解釋。如果您想要其他團隊,請嘗試將「WHERE id = 1」更改爲其他內容。 – 2010-01-14 23:11:19

0

看起來像我在尋找一個MySQL觸發

0

獲取所有團隊:

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) 

在上面的例子中所示的方法拿到名次動態地(而不是填充常規或臨時表) 。

注意:這兩種假定給定的團隊在等級值中僅存在一次纔是正確的。