一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

sql中查出每个分组的前n条记录

时间:2016-04-21 编辑:简简单单 来源:一聚教程网

查询指定分类的前n篇文章

create table `person`
(
  `person` varchar(10),
  `group` int,
  `age` int
);

insert into `person` values
('Bob', 1, 32),
('Jill', 1, 34),
('Shawn', 1, 42),
('Jake', 2, 29),
('Paul', 2, 36),
('Laura', 2, 39);


// 查询语句
SELECT a.person, a.group, a.age FROM person AS a WHERE (SELECT COUNT(*) FROM person AS b WHERE b.group = a.group AND b.age >= a.age) <= 2 ORDER BY a.group ASC, a.age DESC

 

 


一句SQL:取得相同sortid的结果集,每种 ID三条数据

一个表:

SQL代码

CREATE TABLE `book` (   
  `bookid` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  `sortid` int(11) NOT NULL, 
  `bookname` varchar(255) NOT NULL DEFAULT '', 
  PRIMARY KEY (`bookid`) 
) ENGINE=InnoDB AUTO_INCREMENT=80729 DEFAULT CHARSET=utf8; 

数据是这样的:

XML/HTML代码
insert  into `book`(`bookid`,`sortid`,`bookname`) values (1,1,'1'),(2,1,'2'),(3,1,'3'),(4,1,'4'),(5,2,'1'),(6,2,'2'),(7,2,'3'),(8,2,'4'),(9,2,'5'),(10,2,'6'),(11,2,'7'),(12,2,'8'),(13,2,'9'),(14,2,'10'),(15,2,'11'),(16,3,'1'),(17,3,'2'),(18,3,'3'),(19,3,'4'),(20,3,'5'),(21,3,'6'),(22,3,'7'),(23,3,'8'),(24,3,'9'),(25,3,'10'),(26,3,'11'),(27,3,'12'),(28,4,'1'),(29,4,'2'),(30,4,'3'),(31,4,'4'),(32,4,'5'),(33,5,'1'),(34,5,'2'),(35,5,'3'),(36,5,'4'); 

在这种情况下,要取得 sortid IN (1,2,3)的数据,每个sortid的结果是3条。

这种题目网上很多,但真的没有一种特别好SQL,在网上有很多种。最初的时候,我自己是想着用union来处理,但最终这种方法太伤了,同事clear提出的SQL不错,试了一下,在几万条数据的时候,效率还可以,而且SQL相对简单:

SQL代码


SELECT sortid,bookname FROM book b WHERE sortid IN(1,2) AND 3>(SELECT COUNT(1) FROM book WHERE b.sortid=sortid AND bookid


表自关联,在sortid上建索引,效率还不错


How to select the first/least/max row per group in SQL

热门栏目