在做資料顯示時

有時會在列表上給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可以用吧(?)

 

 

創作者介紹

shelleyura 發表在 痞客邦 PIXNET 留言(0) 人氣()