需要用row_number來給分組添加序號(hào)。
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)天祝藏族自治免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1、創(chuàng)建測(cè)試表,插入數(shù)據(jù):
create?table?test(sid?int,sname?varchar(20),sclass?varchar(20),score?int);?insert?into?test?values?(1,'張三','一年一班',100)insert?into?test?values?(2,'李四','一年一班',78)insert?into?test?values?(3,'王五','一年一班',67)insert?into?test?values?(4,'趙六','一年一班',87)insert?into?test?values?(5,'badkano','一年二班',98)insert?into?test?values?(6,'百度知道團(tuán)長(zhǎng)','一年二班',99)insert?into?test?values?(7,'du小小動(dòng)','一年二班',99)insert?into?test?values?(8,'劉備','一年三班',56)insert?into?test?values?(9,'張飛','一年三班',67)insert?into?test?values?(10,'關(guān)羽','一年三班',76)
2、要求按照班級(jí)總分給出班級(jí)排名(即序號(hào)),執(zhí)行語(yǔ)句:
1
select?row_number()?over?(order?by?score?desc)?排名,sclass?班級(jí),score?總分?from?(select?sclass,SUM(score)?score?from?test?group?by?sclass)?t
3、查詢結(jié)果:
問題在于使用了group by 你這么用是在使用了分組之后,在分組內(nèi)使用order by
select * from(
select count(StoreUserPKID),s.StoreUserPKID,s.StoreUserID,sum(v.TimeLength) from tStoreUser as s
inner join tVoucherDetails as v on s.StoreUserPKID=v.VoucherStoreUserPKID where DetailsVoucherAmount0 and
v.remark='支付寶充值' group by StoreUserPKID )
order by v.TimeLength limit 0,20;
這樣試試
MySQL:5.7
SQL語(yǔ)句的寫法:
思路:先進(jìn)行排序,然后再進(jìn)行分組,獲取每組的第一條。
derived_merge指的是一種查詢優(yōu)化技術(shù),作用就是把派生表合并到外部的查詢中,提高數(shù)據(jù)檢索的效率。這個(gè)特性在MySQL5.7版本中被引入,可以通過如下SQL語(yǔ)句進(jìn)行查看/開啟/關(guān)閉等操作。
上面雖然聽起來感覺很牛逼的樣子,但是實(shí)際情況是,這個(gè)新特性,不怎么受歡迎,容易引起錯(cuò)誤。
假設(shè)我們現(xiàn)在把sql中的 distinct(a.id) tid ,去掉,會(huì)發(fā)現(xiàn)子查詢(或者叫:臨時(shí)表)中的order by a.id desc失效了。
為什么會(huì)這樣呢?
原理分析:
我們這里使用了臨時(shí)表排序,繼而對(duì)其結(jié)果進(jìn)行分組,結(jié)果顯示失敗,加了distinct(a.id) tid,后結(jié)果正確,原因是因?yàn)榕R時(shí)表(派生表derived table)中使用order by且使其生效,必須滿足三個(gè)條件:
一旦外部表使用了group by, 那么臨時(shí)表(派生表 derived table)將不會(huì)執(zhí)行filesort操作(即 order by 會(huì)被忽略 )。之后我使用了limit可以使其生效,原因是因?yàn)橐古缮韔rder by生效, 派生表可以通過使用group by、limit、having、distinct等等使其生效 (方法有好多,詳情可看文檔 )
原文鏈接:
在group時(shí)使用*查詢有些不合適的, 建議仔細(xì)研究group的作用.
一般使用group時(shí), select 字段列表里,一定要包含group的字段, 其余的字段也必須和group字段一一對(duì)應(yīng)的, 不然查詢結(jié)果會(huì)有問題. 然后再根據(jù)字段列表里的某些字段進(jìn)行排序就沒有問題了.
--?group_name,?group_id,?group_add_time?個(gè)字段分別為分類名稱,分類id和分類添加的時(shí)間,?它們是一一對(duì)應(yīng)的.?如此查詢是正確的
select?group_name,?group_id,?group_add_time?from?table_name?group?by?group_id?order?by?group_add_time?asc;
--?查詢錯(cuò)誤.?一個(gè)分組(group_id)里可能有多個(gè)uid,?非一一對(duì)應(yīng)
select?uid,?group_name,?group_id,?group_add_time?from?table_name?group?by?group_id?order?by?group_add_time?asc;