CREATE TABLE tbl (id INT PRIMARY KEY, col INT);
INSERT INTO tbl VALUES (1,26),(2,46),(3,35),(4,68),(5,93),(6,92);
-- 排序後:id=1(26), 3(35), 2(46), 4(68), 6(92), 5(93)
# PHP 示例
$rowNum = 0;
while ($row = mysqli_fetch_assoc($result)) {
$rowNum++;
echo $rowNum, $row['id'], $row['col'];
}
SET @rowNum = 0;
SELECT @rowNum := @rowNum + 1 AS rownum, id, col
FROM tbl ORDER BY col;
SELECT a.id, a.col, COUNT(*) AS rownum
FROM tbl a JOIN tbl b ON a.col >= b.col
GROUP BY a.id, a.col ORDER BY a.col;
col 值會產生重複排名SELECT a.*,
(SELECT COUNT(*) FROM tbl WHERE col <= a.col) AS rownum
FROM tbl a ORDER BY col;
SELECT
id, col,
ROW_NUMBER() OVER (ORDER BY col) AS rownum,
RANK() OVER (ORDER BY col) AS rnk,
DENSE_RANK() OVER (ORDER BY col) AS drnk
FROM tbl;
| 函數 | 行為 | 適用場景 |
|---|---|---|
| ROW_NUMBER() | 連續唯一序號 1,2,3... | 分頁、導出編號 |
| RANK() | 並列同名次,跳過下一名 1,2,2,4 | 競賽排名 |
| DENSE_RANK() | 並列同名次,不跳過 1,2,2,3 | 成績等級 |
SELECT * FROM (
SELECT
id, category, score,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY score DESC) AS rn
FROM scores
) t WHERE rn <= 3; -- 每類前 3 名
窗口函數徹底解決了 MySQL 歷史包袱,升級 8.0 是獲得現代 SQL 能力的最佳路徑。