手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

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

首页 > DataBase >

一个表:

SQL代码
  1. CREATE TABLE `book` (   
  2.   `bookid` int(11) unsigned NOT NULL AUTO_INCREMENT,  
  3.   `sortid` int(11) NOT NULL,  
  4.   `bookname` varchar(255) NOT NULL DEFAULT '',  
  5.   PRIMARY KEY (`bookid`)  
  6. ) ENGINE=InnoDB AUTO_INCREMENT=80729 DEFAULT CHARSET=utf8;  

数据是这样的:

XML/HTML代码
  1. 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代码
  1. SELECT sortid,bookname FROM book b WHERE sortid IN(1,2) AND 3>(SELECT COUNT(1) FROM book WHERE b.sortid=sortid AND bookid<b.bookid)   

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




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

« 上一篇 | 下一篇 »

1条记录访客评论

突然看到这篇文章有两个转发了,心里开心了。

Post by gouki on 2011, December 28, 3:28 PM 引用此文发表评论 #1


发表评论

评论内容 (必填):