亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mysql分組取每組前幾條記錄(排名) 附group by與order by的研究

 更新時間:2012年10月18日 01:43:48   作者:  
mysql分組取每組前幾條記錄(排名) 附group by與order by的研究,需要的朋友可以參考下
--按某一字段分組取最大(小)值所在行的數(shù)據(jù)
復(fù)制代碼 代碼如下:

/*
數(shù)據(jù)如下:
name val memo
a 2 a2(a的第二個值)
a 1 a1--a的第一個值
a 3 a3:a的第三個值
b 1 b1--b的第一個值
b 3 b3:b的第三個值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/

--創(chuàng)建表并插入數(shù)據(jù):
復(fù)制代碼 代碼如下:

create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二個值)')
insert into tb values('a', 1, 'a1--a的第一個值')
insert into tb values('a', 3, 'a3:a的第三個值')
insert into tb values('b', 1, 'b1--b的第一個值')
insert into tb values('b', 3, 'b3:b的第三個值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

--一、按name分組取val最大的值所在行的數(shù)據(jù)。
復(fù)制代碼 代碼如下:

--方法1:select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三個值
b 5 b5b5b5b5b5

*/

本人推薦使用1,3,4,結(jié)果顯示1,3,4效率相同,2,5效率差些,不過我3,4效率相同毫無疑問,1就不一樣了,想不搞了。

--二、按name分組取val最小的值所在行的數(shù)據(jù)。
復(fù)制代碼 代碼如下:

--方法1:select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一個值
b 1 b1--b的第一個值

*/

--三、按name分組取第一次出現(xiàn)的行所在的數(shù)據(jù)。
復(fù)制代碼 代碼如下:

select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二個值)
b 1 b1--b的第一個值
*/

--四、按name分組隨機取一條數(shù)據(jù)。
復(fù)制代碼 代碼如下:

select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一個值
b 5 b5b5b5b5b5

*/

--五、按name分組取最小的兩個(N個)val
復(fù)制代碼 代碼如下:

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.valselect a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一個值
a 2 a2(a的第二個值)
b 1 b1--b的第一個值
b 2 b2b2b2b2

*/

--六、按name分組取最大的兩個(N個)val
復(fù)制代碼 代碼如下:

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二個值)
a 3 a3:a的第三個值
b 4 b4b4
b 5 b5b5b5b5b5
*/


--七,假如整行數(shù)據(jù)有重復(fù),所有的列都相同(例如下表中的第5,6兩行數(shù)據(jù)完全相同)。
按name分組取最大的兩個(N個)val
復(fù)制代碼 代碼如下:

/*
數(shù)據(jù)如下:
name val memo
a 2 a2(a的第二個值)
a 1 a1--a的第一個值
a 1 a1--a的第一個值
a 3 a3:a的第三個值
a 3 a3:a的第三個值
b 1 b1--b的第一個值
b 3 b3:b的第三個值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5

*/


附:mysql “group by ”與"order by"的研究

 這兩天讓一個數(shù)據(jù)查詢難了。主要是對group by 理解的不夠深入。才出現(xiàn)這樣的情況

這種需求,我想很多人都遇到過。下面是我模擬我的內(nèi)容表

我現(xiàn)在需要取出每個分類中最新的內(nèi)容
select * from test group by category_id order by `date`

結(jié)果如下

明顯。這不是我想要的數(shù)據(jù),原因是msyql已經(jīng)的執(zhí)行順序是

引用

寫的順序:select ... from... where.... group by... having... order by..
執(zhí)行順序:from... where...group by... having.... select ... order by...

所以在order by拿到的結(jié)果里已經(jīng)是分組的完的最后結(jié)果。
由from到where的結(jié)果如下的內(nèi)容。

到group by時就得到了根據(jù)category_id分出來的多個小組


到了select的時候,只從上面的每個組里取第一條信息結(jié)果會如下

即使order by也只是從上面的結(jié)果里進行排序。并不是每個分類的最新信息。
回到我的目的上 --分類中最新的信息
根據(jù)上面的分析,group by到select時只取到分組里的第一條信息。有兩個解決方法
1,where+group by(對小組進行排序)
2,從form返回的數(shù)據(jù)下手腳(即用子查詢)

由where+group by的解決方法
對group by里的小組進行排序的函數(shù)我只查到group_concat()可以進行排序,但group_concat的作用是將小組里的字段里的值進行串聯(lián)起來。
select group_concat(id order by `date` desc) from `test` group by category_id


再改進一下
select * from `test` where id in(select SUBSTRING_INDEX(group_concat(id order by `date` desc),',',1) from `test` group by category_id ) order by `date` desc



子查詢解決方案
select * from (select * from `test` order by `date` desc) `temp`  group by category_id order by `date` desc


 

相關(guān)文章

  • MySQL 刪除大表的性能問題解決方案

    MySQL 刪除大表的性能問題解決方案

    MySQL在刪除大表engine=innodb(30G+)時,如何減少MySQL hang的時間,本為將提供詳細的解決方案,需要了解的朋友可以參考下
    2012-11-11
  • MySQL的?DDL和DML和DQL的基本語法詳解

    MySQL的?DDL和DML和DQL的基本語法詳解

    SQL語句,即結(jié)構(gòu)化查詢語言(Structured?Query?Language),是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng),這篇文章主要介紹了MySQL的?DDL和DML和DQL的基本語法,需要的朋友可以參考下
    2022-07-07
  • mysql中鎖機制的最全面講解

    mysql中鎖機制的最全面講解

    大概幾個月之前項目中用到事務(wù),需要保證數(shù)據(jù)的強一致性,期間也用到了mysql的鎖,所以本文打算總結(jié)一下mysql的鎖機制,這篇文章主要給大家介紹了關(guān)于mysql中鎖機制的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Ubuntu15下mysql5.6.25不支持中文的解決辦法

    Ubuntu15下mysql5.6.25不支持中文的解決辦法

    Ubuntu15下mysql5.6.25出現(xiàn)亂碼,不支持中文,該問題如何解決呢?下面看看小編是怎么解決此問題的,需要的朋友可以參考下
    2015-09-09
  • MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實例

    MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實例

    這篇文章主要介紹了MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Mysql應(yīng)用安裝后找不到my.ini文件的解決過程

    Mysql應(yīng)用安裝后找不到my.ini文件的解決過程

    剛剛在修改mysql默認配置的時候,發(fā)現(xiàn)找不到my.ini文件,下面這篇文章主要給大家介紹了關(guān)于Mysql應(yīng)用安裝后找不到my.ini文件的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • MySQL實現(xiàn)數(shù)據(jù)批量更新功能詳解

    MySQL實現(xiàn)數(shù)據(jù)批量更新功能詳解

    最近需要批量更新大量數(shù)據(jù),習(xí)慣了寫sql,所以還是用sql來實現(xiàn),下面這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL批量更新的方式,需要的朋友可以參考下
    2023-02-02
  • 解決 phpmyadmin #2002 無法登錄 MySQL 服務(wù)器

    解決 phpmyadmin #2002 無法登錄 MySQL 服務(wù)器

    我以前使用phpmyadmin都是很正常的,從來沒有出現(xiàn)過問題。但是今天出現(xiàn)了提示#2002無法登陸到MYSQL服務(wù)器
    2012-04-04
  • mysql中union和union?all的使用及注意事項

    mysql中union和union?all的使用及注意事項

    這篇文章主要給大家介紹了關(guān)于mysql中union和union?all的使用及注意事項的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • MySql數(shù)據(jù)庫中Select用法小結(jié)

    MySql數(shù)據(jù)庫中Select用法小結(jié)

    在程序開發(fā)中數(shù)據(jù)庫是必要知識點,今天小編給大家介紹mysql數(shù)據(jù)庫中的select用法,包括條件篩選、指定篩選和分組顯示查詢語句的寫法,非常不錯,對mysql select用法相關(guān)知識感興趣的朋友一起看看吧
    2016-10-10

最新評論