如果需要在查詢語句返回的列中包含一列表示該條記錄在整個(gè)結(jié)果集中的行號(hào) ISO SQL: ?標(biāo)準(zhǔn)提出的方法是提供 ROW_NUMBER() / RANK() 函數(shù) Oracle 中可以使用標(biāo)準(zhǔn)方法( i版本以上) 也可以使用非標(biāo)準(zhǔn)的 ROWNUM MS SQL Server 則在 版本中提供了 預(yù)定義用戶變量來實(shí)現(xiàn)
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比仁化網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式仁化網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋仁化地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
set @mycnt = ;select (@mycnt := @mycnt + ) as ROWNUM othercol from tblname order by othercol;
這樣查詢出來的結(jié)果集中 ROWNUM 就保存了行編號(hào)信息 這個(gè)行編號(hào)信息的某種用途在于當(dāng)你需要根據(jù)需要對(duì)數(shù)據(jù)按照某種規(guī)則排序并取出排序之后的某一行數(shù)據(jù) 并且希望知道這行數(shù)據(jù)在之前排序中的位置時(shí)就用得著了 比如
set @mycnt = ;select * from (??? select (@mycnt := @mycnt + ) as ROWNUM othercol ???? from tblname order by othercol) as A where othercol=OneKeyID;
lishixinzhi/Article/program/MySQL/201405/30871
看你的意思行號(hào)就是顯示順序號(hào),你的查詢結(jié)果可以按id升序排序(order by id),這樣查詢結(jié)果的順序就是顯示的順序,這個(gè)行號(hào)可以在程序里加上,不用在數(shù)據(jù)庫(kù)操作。另外最好是加上一個(gè)排序值得字段,這樣可以隨時(shí)調(diào)整顯示順序。
為每一行記錄添加行號(hào)
方法一:為了實(shí)現(xiàn)row_number函數(shù)功能,此方法我們要使用到會(huì)話變量,下面的實(shí)例是從 employees 表中選出5名員工,并為每一行添加行號(hào):
1
2
3
4
5
6
SET@row_number = 0;
SELECT
(@row_number:=@row_number + 1) ?ASnum, firstName, lastName
FROM
employees
LIMIT ?5;
輸出結(jié)果:
在這個(gè)實(shí)例中:首先,定義變量 @row_number ,并初始化為0;然后,在查詢時(shí)我們?yōu)?@row_number 變量加1
方法二:這種方法仍然要用到變量,與上一種方法不同的是,我們把變量當(dāng)做派生表,與主業(yè)務(wù)表關(guān)聯(lián)查詢實(shí)現(xiàn)row_number函數(shù)功能。下面我們?nèi)匀灰圆樵?位員工為例:
1
2
3
4
5
SELECT
(@row_number:=@row_number + 1) ASnum, firstName, lastName
FROM
employees,(SELECT@row_number:=0) ASt
LIMIT 5;
這樣的輸出結(jié)果與上一種結(jié)果是一致的。需要注意的是,在這種方法中,派生表必須要有別名,否則執(zhí)行時(shí)會(huì)出錯(cuò)。為每一組添加行號(hào)。了解ORACLE的朋友應(yīng)該知道,row_number函數(shù)還有一個(gè)非常有用的功能就是分組排序 “over partition by” 。MySQL同樣可以實(shí)現(xiàn)這樣的功能,看下面的實(shí)例:首先將payments表中按照客戶將記錄分組:
1
2
3
4
5
SELECT
customerNumber, paymentDate, amount
FROM
payments
ORDERBYcustomerNumber;
輸出結(jié)果如下:下面我們需要將每個(gè)客戶添加一個(gè)行號(hào),這里我們需要用到兩個(gè)變量,一個(gè)用于存儲(chǔ)行號(hào),一個(gè)用于存儲(chǔ)客戶編號(hào),如:
1
2
3
4
5
6
7
8
9
10
11
SELECT
@row_number := CASE
WHEN@customer_no = customerNumber ?THEN@row_number + 1
ELSE1
ENDASnum,
@customer_no := customerNumber ?asC
根據(jù)具體問題類型,進(jìn)行步驟拆解/原因原理分析/內(nèi)容拓展等。
具體步驟如下:/導(dǎo)致這種情況的原因主要是……
Oracle 中可以使用標(biāo)準(zhǔn)方法(8i版本以上),也可以使用非標(biāo)準(zhǔn)的 ROWNUM ; MS SQL Server 則在 2005 版本中提供了 ROW_NUMBER() 函數(shù);但在 MySQL 中似乎還沒有這樣的系統(tǒng)自帶功能。
解決方法是通過預(yù)定義用戶變量來實(shí)現(xiàn): mysql set @mycnt = 0; mysql select (@mycnt := @mycnt + 1) as ROWNUM ,NAME fromCHARBASE LIMIT 100; 這樣查詢出來的結(jié)果集中 ROWNUM 就保存了行編號(hào)信息。這個(gè)行編號(hào)信息的某種用途在于當(dāng)你需要根據(jù)需要對(duì)數(shù)據(jù)按照某種規(guī)則排序并取出排序之后的某一行數(shù)據(jù),并且希望知道這行數(shù)據(jù)在之前排序中的位置時(shí)就用得著了。