我用下面的語句創建了一個視圖。在項目數量排名中,MYSQL
CREATE VIEW
view_projectHour
AS
SELECT pno
, SUM(hours) AS total_hours
FROM works_on
GROUP BY pno
ORDER BY total_hours DESC
現在,我該如何在這個視圖中實現排名?我想要項目排名。最高時間的項目必須排在第一位,並置於頂部等。也有相同的小時項目。
我用下面的語句創建了一個視圖。在項目數量排名中,MYSQL
CREATE VIEW
view_projectHour
AS
SELECT pno
, SUM(hours) AS total_hours
FROM works_on
GROUP BY pno
ORDER BY total_hours DESC
現在,我該如何在這個視圖中實現排名?我想要項目排名。最高時間的項目必須排在第一位,並置於頂部等。也有相同的小時項目。
另一種解決方案是使用一個JOIN計數多少個值的每一行均排好;
SELECT 1+COUNT(b.total_hours) rank, a.pno, a.total_hours
FROM test a
LEFT JOIN test b
ON a.total_hours < b.total_hours
GROUP BY a.pno, a.total_hours
ORDER BY total_hours DESC;
太棒了,這個工作得很好。我很感激。 – Modaresi
不幸的是,MySQL缺少對分析功能的支持。特別是RANK()
和RANK_DENSE()
。
爲了模擬RANK()
你可以做
SELECT pno, total_hours, rank
FROM
(
SELECT pno, total_hours,
@n := @n + 1 rnum, @r := IF(@h = total_hours, @r, @n) rank, @h := total_hours
FROM
(
SELECT pno, SUM(hours) total_hours
FROM works_on
GROUP BY pno
) q CROSS JOIN (SELECT @n := 0, @r := 0, @h := NULL) i
ORDER BY total_hours DESC, pno
) t
輸出示例:
| PNO | TOTAL_HOURS | RANK | |-----|-------------|------| | 3 | 61 | 1 | | 1 | 40 | 2 | | 2 | 40 | 2 | | 4 | 10 | 4 |
爲了模擬DENSE_RANK()
你可以做
SELECT pno, total_hours, rank
FROM
(
SELECT pno, total_hours,
@r := IF(@h = total_hours, @r, @r + 1) rank, @h := total_hours
FROM
(
SELECT pno, SUM(hours) total_hours
FROM works_on
GROUP BY pno
) q CROSS JOIN (SELECT @r := 0, @h := NULL) i
ORDER BY total_hours DESC, pno
) t
輸出示例:
| PNO | TOTAL_HOURS | RANK | |-----|-------------|------| | 3 | 61 | 1 | | 1 | 40 | 2 | | 2 | 40 | 2 | | 4 | 10 | 3 |
注:您可以溝外SELECT
■如果你不介意在你的結果集的一個或兩個額外列。
這裏是SQLFiddle演示
以前看的是同樣的東西,在MySQL文檔中發現了這個; [作爲一般規則,除了在SET語句中,您不應該爲用戶變量賦值並在相同的語句中讀取該值。 ...對於其他語句,如SELECT,您可能會得到您期望的結果,但不能保證。 ...涉及用戶變量的表達式的評估順序未定義。](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html) –
@JoachimIsaksson是的我知道,它就像使用MySQL'GROUP BY'擴展名:沒有保證,但按預期工作。它可以是或者使用'COUNT()'來模擬等級函數或者在客戶端執行。無論如何**感謝您的輸入。我同意至少OP應該知道它。 – peterm
它排序正確,但對於列列它將輸出「[BLOB - 1B」,這是MySQL的錯誤返回一個空的結果集。 – Modaresi
換言之,可能存在關係,但關係應如何排名?也就是說,如果雙方並列第一名,那麼排名第一和第二名都是第三名? –
是的,那很好。要麼是這個,要麼就是#1和下一個#2。 – Modaresi
我認爲你可以通過@Salman在另一個主題中發佈的解決方案來解決這個問題:http://stackoverflow.com/a/14297055/780592 – Akatum