分組後查找每組的前N條記錄語句
Java代碼
考你一條sql語句
如有表 student
id name age class
1 張1 15 1
2 張2 15 1
3 張3 15 1
4 張4 15 2
5 張5 15 2
6 張6 15 2
7 張7 15 3
8 張8 15 3
9 張9 15 3
10 張10 15 5
11 張11 15 5
現在想得到每個班級的前2名學生資料
根據題意是,按class分組,然後取id靠前的兩名,相信大多數人都能想到基本組合:
www.2cto.com
SELECT a.*
FROM student a
ORDER BY a.class, a.id;
另加:Limit 0,2來配合。
(注:MYSQL 中沒有top n的寫法,取代的是LIMIT。)
Limit 0,n只能取到最前的n位,但如何能取到每個班的前兩位呢,就無從下手了。
下面我來具體分析一下這題的解法:
1、獲取每個class的前兩位:
SELECT a.*
FROM student a
WHERE
(
www.2cto.com
SELECT COUNT(*)
FROM student
WHERE class = a.class
AND id < a.id
) < 2
#遍歷所有記錄,然後取該條記錄與同班中的所有記錄比較,只有當班上不超過兩個人(含兩個人)比該記錄id小的話,該記錄才被認定為該記錄id排名前2,然後顯示出來。
2、當獲取所有合格的數據有,按class與id排序:
在最後添加:
www.2cto.com
ORDER BY a.class, a.id;
最終結果:
SELECT a. *
FROM student a
WHERE (
SELECT COUNT( * )
FROM student
WHERE class = a.class
AND id < a.id
) <2
ORDER BY a.class, a.id
LIMIT 0 , 30;
遍歷所有記錄,然後取該條記錄與actionid中的所有記錄比較,只有id不超過1個比該記錄id小的話,該記錄才被認定為該記錄id為最大id,然後顯示出來。
www.2cto.com
Java代碼
SELECT a.*
FROM messagesend a
WHERE (
SELECT COUNT( * )
FROM messagesend t
WHERE t.actionid = a.actionid
AND id < a.id
) <1