最近工作中会涉及复杂的SQL语句,还是挺有意思的。以前想写没有应用场景,现在正好可以多锻炼锻炼。我觉得在实际开发中,程序代码并不是最难的,最难的还是SQL。SQL逻辑性最强,而且还要很清楚表设计,业务场景。特别是复杂的业条场景下提炼数据,要考虑到功能,性能,是否会锁表。

需求:有一张表保存诺干条广告信息。当APP启动时,根据登录用户所在的区域,随机取出一条广告返回,作为启动页。

数据库:MySQL

刚开始,我的做法是:

select floor(max(startPageId) * rand()) from ghome.ghome_startpage_info where 1=1 and status!='00';

startPageId是自动增长的Integer型

其他where条件不贴出来了。这句意思是,查询符合条件的数据,根据 max 函数找出结果最大的,乘以 rand 函数随机生成的一个小于1的数,再用 floor 去掉小数位。得出一个 randId。

再执行

select startPageId,startPageName,validStartTime,validEndTime,pageImageUrl,pageLinkUrl,allowBreak,waitTime

from ghome.ghome_startpage_info where 1=1 and status!='00' and startPageId >= randId limit 1;

根据查询条件,startPageId大于等于刚刚得出来的随机id。

这个语句没有错,性能也挺好。但是有一个问题,当数据有删除,startPageId就不连续,或者条件筛选后最小startPageId比较大时,容易得到的一个范围,很大可能性取的是同一条。

对于这种情况,需要自己根据查询结果重新设置id序号,然后再取结果。优化如下:

select floor(count(startPageId) * rand()) from ghome.ghome_startpage_info where 1=1 and status!='00';

使用 count 函数查出结果数,乘以 rand 函数随机生成的一个小于1的数,再用 floor 去掉小数位。得出一个 randId。

然后从结果表里取数据。

该图是子语句的结果信息。可能是MySQL不允许直接用生成的id作条件。所以把查询结果作为外面select语句的结果表。

select * from (select (@i:=@i+1) as id, startPageId,startPageName,validStartTime,validEndTime,pageImageUrl,pageLinkUrl,allowBreak,waitTime

from ghome.ghome_startpage_info,(select @i:=0) as it where 1=1 and status='02') as t where id => randId limit 1;

执行成功,取出结果数据返回。

PS:第一种方法,是大多数博主推荐的做法。但实际应用时,出现了刚刚这个问题。所以程序开发一定要仔细考虑各种情况,亲自动手验证。

mysql查询结果随机取一个_从SQL查询结果随机取一条数据相关推荐

  1. sql \n 查询_探索SQL查询提示选项(快速N)

    sql \n 查询 In this article, we will introduce SQL queries hint and will analyze the OPTION(Fast 'N') ...

  2. MySQL笔记:第06章_多表查询

    第06章_多表查询 多表查询概述 1.一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 演示代码 2. 多表查询分类讲解 分类1:等值连接 vs 非等值连接 等值连接 非 ...

  3. mysql统计出每个姓氏的人数_基于SQL中的数据查询语句汇总

    where条件表达式 --统计函数 Select count(1) from student; --like模糊查询 --统计班上姓张的人数 select count(*) from student ...

  4. python爬取物流信息_快递信息查询爬虫 python实现

    import json,requests #输入运单号码,注意,只有正在途中的快递才可以查到! packageNum = input('请输入运单号码:') url1 = 'http://www.ku ...

  5. mysql多表查询有几种方法_多表查询有几种方式

    多表查询有3种方式,分别是:1.传统方式,包括左外连接查询,右外连接查询 ,完全外链接查询:2.子查询方式,包括单行查询,多行查询:3.聚合查询方式,包括求和,平均查询,记录总数. 多表查询有3种方式 ...

  6. mysql中查询的第一名_使用SQL查询每科第一名及最后一名(学科、姓名、分数)...

    前段时间面试遇到被对方现场考察SQL水平的情况,现场写出来了但被面试官告知不正确,今天分享一下正确写法,一起共勉. 题目:使用SQL查询每科第一名及最后一名(学科.姓名.分数) 自己创建了下表以方便演 ...

  7. mysql查询各科成绩前三名的记录,sql查询各科成绩前三名----详述过程,思路清晰不烧脑...

    使用mysql.hive查询各科成绩前三名 一.建表造数据 建表: create table scores( name varchar(100), subject varchar(100), scor ...

  8. 震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

    作者 | 唐磊 责编 | Carol 来源 | 程序猿石头 封图 | CSDN 付费下载于视觉中国 最近工作上遇到一个"神奇"的问题,或许对大家有帮助,因此形成本文. 问题大概是, ...

  9. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

    MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...

最新文章

  1. 香!用一行命令实现文本检索电脑图片|教程
  2. 【Python】Cookie 和 Session
  3. vue项目和react项目中禁止eslint
  4. C++类中的访问权限问题---public/protected/private
  5. 异常:java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext
  6. 组态王bitset用法_关于STEP7在组态王里定义I/O离散变量
  7. [svn] 解决SVN冲突攻略(手册)
  8. Swift学习笔记(10)--枚举
  9. tab和TabHost
  10. ZooKeeper解读
  11. 迅雷网速测试器 - 下载速率测试记录
  12. 数据库三范式设计习题
  13. linux 找u盘,linux系统怎样找到U盘?
  14. 实验八---理解进程调度时机跟踪分析进程调度与进程切换的过程
  15. C++设计模式——观察者模式(高屋建瓴)
  16. 遗传算法计算函数最小值(多维)
  17. Java毕设项目汽车4S服务管理系统(java+VUE+Mybatis+Maven+Mysql)
  18. Linux sed编辑器(精讲)
  19. 半监督医学影像分割综述
  20. QSettings介绍与使用

热门文章

  1. 计算机二级考试选择题题库搜题,计算机二级考试科目必须全考吗?C语言考试题型是什么?...
  2. android 获取手机颜色代码,Android获取当前主题的颜色属性
  3. html 纯ccs弹窗口,CCS+DIV实战代码示例--一个静态页面
  4. 计算机保存和另存为的区别,电脑另存为在哪里
  5. 盘点天龙历史:七年以来所有资料片
  6. 【英语语法】Unit2 介词和并列连词
  7. Java项目源码下载S2SH基于JAVA的宠物管理系统实现|动物管理
  8. 【524. 通过删除字母匹配到字典里最长单词】
  9. 蓝牙耳机-------------蓝牙音频延迟全解析
  10. 整数拆分、不同的二叉搜索树-代码随想录