程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql分組取每組前幾筆記錄(排名) 附group by與order by的研討

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

編輯:MySQL綜合教程

mysql分組取每組前幾筆記錄(排名) 附group by與order by的研討。本站提示廣大學習愛好者:(mysql分組取每組前幾筆記錄(排名) 附group by與order by的研討)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql分組取每組前幾筆記錄(排名) 附group by與order by的研討正文


--按某一字段分組取最年夜(小)值地點行的數據

/*
數據以下:
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
*/

--創立表並拔出數據:

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

--1、按name分組取val最年夜的值地點行的數據。

--辦法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,成果顯示1,3,4效力雷同,2,5效力差些,不外我3,4效力雷同毫無疑問,1就紛歧樣了,想不弄了。

--2、按name分組取val最小的值地點行的數據。

--辦法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的第一個值

*/

--3、按name分組取第一次湧現的行地點的數據。

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的第一個值
*/

--4、按name分組隨機取一條數據。

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

*/

--5、按name分組取最小的兩個(N個)val

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

*/

--6、按name分組取最年夜的兩個(N個)val

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
*/


--七,假設整行數據有反復,一切的列都雷同(例以下表中的第5,6兩行數據完整雷同)。
按name分組取最年夜的兩個(N個)val

/*
數據以下:
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"的研討

 這兩天讓一個數據查詢難了。重要是對group by 懂得的不敷深刻。才湧現如許的情形

這類需求,我想許多人都碰到過。上面是我模仿我的內容表

我如今須要掏出每一個分類中最新的內容
select * from test group by category_id order by `date`
成果以下

顯著。這不是我想要的數據,緣由是msyql曾經的履行次序是

援用
寫的次序:select ... from... where.... group by... having... order by..
履行次序:from... where...group by... having.... select ... order by...
所以在order by拿到的成果裡曾經是分組的完的最初成果。
由from到where的成果以下的內容。

到group by時就獲得了依據category_id分出來的多個小組


到了select的時刻,只從下面的每一個組裡取第一條信息成果會以下

即便order by也只是從下面的成果裡停止排序。其實不是每一個分類的最新信息。
回到我的目標上 --分類中最新的信息
依據下面的剖析,group by到select時只取到分組裡的第一條信息。有兩個處理辦法
1,where+group by(對小組停止排序)
2,從form前往的數據下四肢舉動(即用子查詢)

由where+group by的處理辦法
對group by裡的小組停止排序的函數我只查到group_concat()可以停止排序,但group_concat的感化是將小組裡的字段裡的值停止串連起來。
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


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved