[SQL] MySQL ROW_NUMBER Simulation

在台大 PTT Database 版看到有人問一個問題,我覺得還不錯,問題如下:網頁版

小弟在練習做一個系統遇到以下問題 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | c | 退選 4 | d | 退選 5 | e | 退選 網頁介面如上(用for迴圈+mysql_fetch_object抓出資料) 報名序號 | 姓名 | 志願1 | 志願2 | 志願3 | 志願4 | 志願5 1001 小王 a b c d e 資料庫欄位內容如上 想請問若使用者想退選志願3~~照理說用update把志願3欄位清掉 網頁再一次抓資料會變成志願3的系所變空的(如下表) 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | | 退選 4 | d | 退選 5 | e | 退選 有沒有辦法在select的時候排除空的那欄 也就是說抓資料的時候,以上述為例,只抓出4筆,變成下表 志願 | 系所 | 功能 1 | a | 退選 2 | b | 退選 3 | d | 退選 4 | e | 退選

我自己也有提供解法,MySQL 跟 MSSQL 都可以做到,單純 PHP 也是可以解決的,底下提供兩種解法,一種是 PHP,一種是 MySQL 可以解決:

select 志願, 系所, 功能 from table where 系所 != '' order by 志願

$i = 1;
while()
{
  /*
  處理程式陣列
  */
  $i++;
}
MySQL 解法:
SET @row = 0;
SELECT @row := @row +1 AS rk, 系所, 功能 from table
where 系所 != '' order by 志願
MSSQL 解法:
SELECT ROW_NUMBER() OVER (ORDER BY NAME) NO, NAME FROM TABLE
可以參考 MySQL 這篇:

MySQL Forums :: Transactions :: ROW_NUMBER Simulation


See also