專案一開始定義使用輕量級資料庫sqlite來處理資料, 用著用著發現想要做個排序功能
卻發現sqlite沒有現成的排序函式rank()
等等,
使用排序後臨時表的rowid
也不行, 查詢的出來的rowid
是真實資料的,並不是臨時表;
這個節點換資料庫就不現實,函式不也是底層邏輯組合起來的麼, 只能自己動手豐衣足食。
本過程沒有深究 其他資料庫rank()
函式的原理,主要目的是實現相同的功能,滿足基本使用。
同時也歡迎感興趣的小夥伴對 sql**進行拓展及優化。
實際**,其實步驟3就已經結束,後面均是驗證。
已知:成績分數;
需求:做乙個成績排行榜
簡單分析:
1. 對成績排序,生成成績排名後插入資料;
2. 每插入一條成績,則更新排行榜。
表a 和 資料
rowid(資料庫自帶)
score
rank110
–28–
36–4
4–步驟1 獲取序列
統計比當前成績高的成績有多少, 其中a1.*
是為了便於檢視資料
select
count(*
)as num,a1.rowid,a1.
*from a a1, a b1
where a1.score < b1.score
group
by a1.rowid
結果:
numrowid
score
rank12
8–23
6–34
4–步驟2 序列號 轉換成 順序
將表a 與上面查詢到的結果進行 左關聯,其中c1.*
是為了便於檢視資料
with aa2 as
(select
count(*
)as num,a1.rowid
from a a1, a b1
where a1.score < b1.score
group
by a1.rowid)
select ifnull(aa2.num,0)
+1as rankplus , c1.
*from a c1
left
join aa2 on aa2.rowid = c1.rowid
結果:
rankplus
score
rank110
–28–
36–4
4–步驟3 更新表的順序字段
將查詢到的結果更新到表a裡面
update a set rank =
(with aa2 as
(select
count(*
)as num,a1.rowid
from a a1, a b1
where a1.score < b1.score
group
by a1.rowid)
select ifnull(aa2.num,0)
+1as rankplus /*, c1.**/
from a c1
left
join aa2 on aa2.rowid = c1.rowid
where c1.rowid = a.rowid
)where score <
11
這裡需要說明下where score <11
是因為update
語句一定要有條件跟隨,不然會整個表的資料都更新。
步驟4 結果校驗
執行select * from a
檢視下結果校驗下。
結果:rowid(資料庫自帶)
score
rank110
1282
3634
44步驟5 初步優化-更新部分資料
上述表 是結果優化,其實每插入一條資料,
有順序變更的是成績不如插入成績的那些資料
insert
into a values(7
,null);
update a set rank =
(with aa2 as
(select
count(*
)as num,a1.rowid
from a a1, a b1
where a1.score < b1.score
group
by a1.rowid)
select ifnull(aa2.num,0)
+1as rankplus /*, c1.**/
from a c1
left
join aa2 on aa2.rowid = c1.rowid
where c1.rowid = a.rowid
)where score <=7;
--和插入資料的 成績 7 保持一致
select
*from a ;
結果:
rowid(資料庫自帶)
score
rank110
1282
36444
5
57
3
步驟6 測試-插入相同成績
將步驟5的指令碼再次執行一遍,即再插入一次 成績7 。
結果:rowid(資料庫自帶)
score
rank110
1282
36544
657
367
3
最終**
我這裡將rowid
當作資料的唯一主鍵來使用了,
若rowid
會因臨時表變動而變動,則更簡單了,都可以省略步驟2中的左連線內容了
insert
into a values(7
,null);
update a set rank =
(with aa2 as
(select
count(*
)as num,a1.rowid
from a a1, a b1
where a1.score < b1.score
group
by a1.rowid)
select ifnull(aa2.num,0)
+1as rankplus /*, c1.**/
from a c1
left
join aa2 on aa2.rowid = c1.rowid
where c1.rowid = a.rowid
)where score <=7;
--和插入資料的 成績 7 保持一致
手動編寫AJAX過程
ajax 全稱 asynchronous j ascript and xml 非同步的 j ascript 和 xml 之前在學校沒認真學過,只知道ajax就代表區域性重新整理,能提高效率。最近一直接觸web方面的專案,遂到網上找了找相關知識,記錄一下。現有理解又多了一下,ajax相當於在客戶端和伺...
手動編寫C語言字串函式
c語言字串庫string.h包含很多常用的字串函式 字串長度函式strlen 字串比較函式strcmp 字串拷貝函式strcpy 字串追加函式strcat 左起尋找字元函式strchr 右起尋找字元函式strrchr 尋找字串函式strstr 忽略大小寫尋找字串函式strcasestr 乙個字串以 ...
sqlite3 編寫簡易通訊錄
以下貼出的是我用sqlite3寫的簡易通訊錄,注意編譯時鏈結上sqlite3庫,若有什麼錯誤望大牛指正 include include include include define max size 1024 static sqlite3 db null static char errmsg nul...