第一種:MySQL 隨機(jī)排序常規(guī)寫法:展開目錄
成都創(chuàng)新互聯(lián)云計算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過13年的服務(wù)器租用、成都服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗,已先后獲得國家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、虛擬主機(jī)、空間域名、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100;
執(zhí)行耗時 1.18s
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100;
執(zhí)行耗時 1.25s
這樣的耗時不能接受。
第二種:stackoverflow 上找了一個黑科技寫法:展開目錄
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) 0xffffLIMIT100;
執(zhí)行耗時 150ms
SELECT*FROMusersWHEREtotalScoreBETWEEN5AND100ORDERBY37*(UNIX_TIMESTAMP() ^id) 0xffffLIMIT100;
執(zhí)行耗時 153ms
執(zhí)行耗時直接縮短至 150ms,已經(jīng)比上一個寫法快很多了,而且 LIMIT 1000 時耗時也是 150ms 左右。
第三種方式:展開目錄
SELECT*
FROMusersASu
INNERJOIN(SELECTidFROMusersWHEREtotalScoreBETWEEN5AND100ORDERBYRAND()LIMIT100)AStONt.id=u.id
WHERE1
執(zhí)行耗時 110ms
LIMIT 1000 時耗時也穩(wěn)定在 110ms 左右。
耗時最少,推薦使用第三種。
由于mysql沒有row_number()方法,只能通過其它方法來進(jìn)行排序,以下為使用變量來實現(xiàn)排序
示例1:以col1分組,col2正序排序
示例2:以col1分組,col2倒序排序
ORDER BY 默認(rèn)按升序排列,因此 ASC (升序)子句是可選的。
另外,還可以按降序排列,為此可以使用 DESC(降序)。
ORDER BY 子句中還可以用數(shù)字來表示對應(yīng)的列 3 對應(yīng)于 SELECT 中指定的第 3 列,即工資。
按從左到右的順序依次根據(jù) ORDER BY 子句中指定的列進(jìn)行排序。
指定用于排序的列時,如果使用的是 SELECT 子句中列的數(shù)字位置,那么指定的數(shù)字不能超過 SELECT 子句中指定的列數(shù)。( 不能超出索引 )
通常,可以按 SELECT 子句中未指定的列進(jìn)行排序,但必須指定列名。然而,如果在查詢中使用了GROUP BY 或 DISTINCT 子句,就不能按SELECT 子句中未指定的列進(jìn)行排序。
要求:顯示部門編號為 10 的員工的姓名、職位和薪水,并根據(jù)薪水按從低到高的順序排列想獲得上面這樣的數(shù)據(jù)結(jié)果
如果想對表中多個字段進(jìn)行不同的排列如工資表按照升序排列,年齡按照降序排列
可以再ORDER之后用逗號隔開不同排列的字段
MySQL的排序,使用order by來實現(xiàn)。
order by id asc,表示用id升序排列
order by id desc,表示用id降序排列
當(dāng)需要用多個字段排序時,order by cdate desc,id asc,表示先用cdate降序排列,cdate相同的再用id升序排列