在做資料顯示時
有時會在列表上給1, 2, 3, 4, 5...編號
反正查出來的資料, 也都還會用程式跑迴圈, 做一些處理
所以也都用程式來加編號
可是呀, 這回不一樣了
畫面上, 進到單筆資料編輯頁時
還要顯示, 正在編輯的是 第 N 筆 記錄
如果是用程式處理, 那可要把全部資料都抓來, 一筆筆找, 目前編的是第幾筆
找這東東可不是我擅長的, 程式碼好像要寫很長, 而且很沒效率的樣子...←抱怨一堆
還好, 找到sql語法, 可以幫忙計算出編號
select (select SUM(1) from Region where RegionID <= reg.RegionID) as 'Row Number', * from Region reg;
出處: http://geekswithblogs.net/congsuco/articles/21042.aspx
計算出編號的, 主要是這一段:
(select SUM(1) from Region where RegionID <= reg.RegionID) as 'Row Number'
這一欄的值, 是再查一次同一個table, 在id還沒大於這筆資料id之前, 每次都累加1
然後, 把這欄的名稱, 命名為 Row Number
用這種寫法, 一行select就解決了, 方便得很
只是說, 他也是一行行的累加1, 每筆資料都要做一樣的動作
效能上可能也沒好到哪裡去吧
少量資料用起來還蠻方便的
後來, 改成我需要的寫法變以下的樣子:
select (select SUM(1) from event_time where et_id <= et.et_id and e_id=27601) as RowNumber, * from event_time as et where et.e_id=27601;
rownumber | e_id | et_id
-----------+-------+-------
3 | 27601 | 14430
2 | 27601 | 14428
1 | 27601 | 14424
(3 筆資料列)
只抓出其中一筆:
select (select SUM(1) from event_time where et_id <= et.et_id and e_id=27601) as RowNumber, * from event_time as et where et.e_id=27601 and et.et_id=14428;
rownumber | e_id | et_id
-----------+-------+-------
2 | 27601 | 14428
(1 筆資料列)
再改一下寫法, 它就會幫我, 按照e_id, 數1234:
select (select SUM(1) from event_time where et_id <= et.et_id and e_id=et.e_id) as RowNumber, * from event_time as et order by et.e_id, et.et_id;
rownumber | e_id | et_id
-----------+------+-------
1 | 1581 | 344
2 | 1581 | 345
3 | 1581 | 346
4 | 1581 | 347
5 | 1581 | 348
6 | 1581 | 349
7 | 1581 | 350
8 | 1581 | 351
1 | 1601 | 377
2 | 1601 | 378
3 | 1601 | 381
1 | 1804 | 602
2 | 1804 | 603
3 | 1804 | 604
4 | 1804 | 605
5 | 1804 | 606
(16 筆資料列)
ps. 大量資料真的不建議這種方法
因為在試寫的時候, 我忘了這個table裡, 有1萬多筆記錄
直接下了以下的query:
select (select SUM(1) from event_time where et_id <= et.et_id) as RowNumber, * from event_time as et;
然後......我就等了超過十秒還沒見到資料.....很快就中斷查詢←等了十秒也夠久了
雖然是測試站DB, 還是要好好的愛護它(汗)
問我還有什麼方法?
加寫DB function也可以做到
可是我不會寫...*-*
有的DB可能有內建的function可以用吧(?)