mysql自连接分组查询最新_MySQL 自连接分组取每组最大N条记录
1、測試數據:
create table t2 (
id int primary key,
gid char,
col1 int,
col2 int
) engine=myisam;
insert into t2 values
(1,'A',31,6),
(2,'B',25,83),
(3,'C',76,21),
(4,'D',63,56),
(5,'E',3,17),
(6,'A',29,97),
(7,'B',88,63),
(8,'C',16,22),
(9,'D',25,43),
(10,'E',45,28),
(11,'A',2,78),
(12,'B',30,79),
(13,'C',96,73),
(14,'D',37,40),
(15,'E',14,86),
(16,'A',32,67),
(17,'B',84,38),
(18,'C',27,9),
(19,'D',31,21),
(20,'E',80,63),
(21,'A',89,9),
(22,'B',15,22),
(23,'C',46,84),
(24,'D',54,79),
(25,'E',85,64),
(26,'A',87,13),
(27,'B',40,45),
(28,'C',34,90),
(29,'D',63,8),
(30,'E',66,40),
(31,'A',83,49),
(32,'B',4,90),
(33,'C',81,7),
(34,'D',11,12),
(35,'E',85,10),
(36,'A',39,75),
(37,'B',22,39),
(38,'C',76,67),
(39,'D',20,11),
(40,'E',81,36);
2、問題:
期望結果
1) N=1 取GID每組 COL2最大的記錄
+----+------+------+------+
| id | gid | col1 | col2 |
+----+------+------+------+
| 6 | A | 29 | 97 |
| 15 | E | 14 | 86 |
| 24 | D | 54 | 79 |
| 28 | C | 34 | 90 |
| 32 | B | 4 | 90 |
+----+------+------+------+
2) N=3 取GID每組 COL2最大的3條記錄
+----+------+------+------+
| id | gid | col1 | col2 |
+----+------+------+------+
| 6 | A | 29 | 97 |
| 11 | A | 2 | 78 |
| 36 | A | 39 | 75 |
| 32 | B | 4 | 90 |
| 2 | B | 25 | 83 |
| 12 | B | 30 | 79 |
| 28 | C | 34 | 90 |
| 23 | C | 46 | 84 |
| 13 | C | 96 | 73 |
| 24 | D | 54 | 79 |
| 4 | D | 63 | 56 |
| 9 | D | 25 | 43 |
| 15 | E | 14 | 86 |
| 25 | E | 85 | 64 |
| 20 | E | 80 | 63 |
+----+------+------+------+
3、答案:
1)
select * from t2 a
where not exists
(select 1 from t2 where gid=a.gid and col2>a.col2);
或者:
select*from(select*fromt2orderbygid,col2desc) tgroupbygid;
2)
select * from t2 a where
3>(select count(*) from t2 where gid=a.gid and col2>a.col2)
order by a.gid,a.col2 desc;
類似的問題:
--------------------
public class User{
//數據庫表明也是User
private String userId;//id
private String userName;//用戶名
private Date cd_time;注冊時間
private User inviteUser; //邀請人(填的實際上邀請人的ID【外鍵】)
}
有如下數據,注冊時間沒有寫,就是系統當前時間
1 ?張一 ?null
2 ?張二 ?null
3 ?張三 ?null
4 ?張四 ?null
5 ?張五 ?1 ? ?-------------表示張五是張一邀請來的
6 ?張六 ?2 ? ?-------------表示張劉是張二邀請來的
7 ?張七 ?3
8 ?張八 ?4
9 ?張九 ?5
10 王一 ?6
11 王二 ?6
12 王三 ?6
13 王四 ?1
14 王五 ?13
需求是,按時間順序,查詢出前十條
像這樣:
張一,2 張一邀請了2人
張二,1 張二邀請了1人
張三,1
...
張五,1
張六,3 張六邀請了3人
王四,1 王四邀請了1人
select a.userName, count(b.userId)
from User a left join User b on a.userId = b.inviteUser
group by a.userName
總結
以上是生活随笔為你收集整理的mysql自连接分组查询最新_MySQL 自连接分组取每组最大N条记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人寿保险怎么查自己的保险 我的人寿保险怎
- 下一篇: 银行卡密码忘记了可以在手机上自己弄吗