mysql查询各种类型的前n条数据

2024-02-05 22:58

本文主要是介绍mysql查询各种类型的前n条数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://www.likezhou.com/find/11681.html

查询各种类型的前n条数据的的sql写法,有好几种:

假设要查询每种分类点击量前三的数据,type为类型字段,clickNum为点击数。

第一种:

select

*

from

table AS a

where

(select COUNT(*) from table AS b where

b.type= a.type

AND

b.clickNum >= a.clickNum) <= 3

ORDER BY a.type_id asc,a.clickNum DESC;

 

用上面的方法,有一个问题,就是如果记录的点击数刚好有一摸一样的,就容易漏掉数据。而且如果数据量一大,上面的查询性能是非常差的。基本是数据条数的平方这样的量级。比如如果有100条数据,那可能就是要查询10000次。

 

第二种:是国外某个人写的一种方法,测试过,可以用。

 

set @num := 0, @type := '';           

SELECT * FROM 

(SELECT *, 

@num := if(@type = type, @num + 1, 1) as row_num,

@type := type 

FROM table

order by type ASC,clickNum DESC)

as temp

WHERE temp.row_num <=3;

 

这个的查询效率就还ok,扫描的量级相比上面是控制在o(n)这种量级,性能提升是很明显的,不过有个问题,如果你用mybatis操作数据库,这个代码貌似运行不成功,或者并没有得到自己想要的结果。具体原因我也不知道,有知道的麻烦告诉我一下。

 

第三种,我最后采用的方式,就是用union all。写法如下:

(select * from table where type = 'apple' order by price limit 2)
union all
(select * from table where type = 'orange' order by price limit 2)
union all
(select * from table where type = 'pear' order by price limit 2)
union all
(select * from table where type = 'cherry' order by price limit 2)

 

说白了对每种类型根据你所要条件进行查询,然后用union all进行连接即可。当然我之所以采用这种方式是因为在mybatis里面也可以实现写法,如下

 

<select id="selectdatabyType" resultMap="ResultMapWithBLOBs" ><foreach collection="list" item="item" index="index" separator="union all">(select<include refid="Base_Column_List" />fromtable where type = ${item.id} and status=1 order by clickNum DESC      limit 0,3)</foreach>
</select>

上面的实现的关键是,记得加()。

这篇关于mysql查询各种类型的前n条数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682433

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines