sql语句之随机查询记录和批量插入--基于mysql
本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录;2,然后把这些记录和另外一些值组成完整的行记录插入到数据表中。
1,事出有因
佛说,凡事都有因果,不怨天尤人(其实我不信佛,我也忍不了不怨)。事情是这样的:我司开发了一个简单的投票系统,系统上线后一直运行的比较顺利直到上周末......话说那日我正端坐于禅座上闭目悟道,眼看就要入定了,突然间眼前一道白光闪过,白光中带着几个字:“S施主的作品在网页中突然丢失,请尽快查清问题。另注:此作品备受欢迎,已有八百位观众投过票”,那白光中隐隐约约的呈现出产品大人的微微发光的徽记,啊,那正是大人的微信头像。
我马上答道:“谨遵产品大人旨意,马上照办”。于是乎,ssh到服务器,mysql到数据库客户端,按照S施主的姓名顺藤摸瓜的一顿摸索,结果发现:S施主只有用户注册记录、而作品记录却是空空的。我马上回复产品大人:“S施主在我系统中注册过,但其未有作品录入”。
产品大人回复道:“系统是不是遭到了黑客攻击,请务必查清是否有系统漏洞会被邪恶之人利用远程法术盗窃、毁坏数据,并查找数据库的备份,务必恢复S施主的作品信息”。
我思索了下,答道:”照办“。
于是,立马打开代码,查看逻辑,然后意识到我司开发的这套系统是基于微信身份认证的,作品的上传、编辑、删除、投票都需要经过微信身份认证才可以,否则登录都没发登录,也就谈不上发起什么恶意请求了。然后,我又查看了下作品删除的逻辑,删除动作只允许POST请求,且此处结合了session机制,必须为作品拥有者才能做删除动作。然后,我又查看了几个数据库备份,发现在这几个时间点上都没有发现S施主的作品痕迹。
于是,我向产品大人回复了检查结果。
产品大人沉吟了一段时间后道:“我与S施主商议下,让其重新上传作品,然后你将投票数量给他恢复下吧”。
我顺口答道:“OK”。
2,见招拆招
作为一名刚入互联网江湖不久的小僧,知道江湖广大无边,莫说修炼方法千万,即便是某一门派的经书、技艺也是繁琐复杂的很。比如要完成上面产品大人的任务,那就涉及到了mysql这门技艺。补上S施主的投票记录,若是十条、八条的也就罢了,大不了打一通少林长拳,在mysql客户端将下面的命令敲它个十遍、八遍不就可以了么。
insert into values(作品id, 投票者id, 投票时间);
问题是800条记录,那敲起来也是很费体力的。况且,对于S施主的这一作品,投票记录中作者id应为在系统中注册过的且不能重复、投票时间不能全都是一个时间才对。看来少林长拳虽勇猛,遇上这个对手,却是占了下风。那么只能这么办了:从已有的投票记录表中随机抽出800条不重复的用户记录,然后将这些记录与相应字段构成完整的记录行再插入数据表。
3,破招
招一,少林拈花指--sql随机抓取。
SELECT distinct 投票者id
FROM 投票表
WHERE 投票者id >=
(
(SELECT MAX(投票者id) FROM 投票表)
-(SELECT MIN(投票者id) FROM 投票表)) * RAND()
+ (SELECT MIN(投票者id) FROM 投票表
)
LIMIT 800;
招二,自动化少林长拳--php构造sql插入语句
// 数据库连接过程及$sql1省略 $stmt1 = $db->prepare($sql1);
$e = $stmt1->setFetchMode(PDO::FETCH_NUM);
$stmt1->execute();
$r1 = $stmt1->fetchAll(); $time = strtotime('2017-02-20 08:00:00') + 60; // 拼接插入sql语句
$sql2 = 'insert into 投票表 values';
foreach ($r1 as $row) {
$sql2 .= '(' . S施主作品id . ',' . $row[0] . ',' . "'" . date('Y-m-d H:i:s', $time) . "'" . '),';
$time += 60;
}
$sql2 = rtrim($sql2, ',') . ';'; $stmt2 = $db->prepare($sql2);
$r2 = $stmt2->execute();
有此两招,必解决强敌。
4,后记
此事暂未结束。S施主的作品到底是如何丢失的,现在还是毫无头绪,江湖中的哪位大侠、高手有看出其中破绽的希望能给在下指点一二。
完
版权所有,江湖中的弟兄若看得上在下的招式拳谱尽管拿走,注明招式版权、来源链接即可。
参考资料:
sql语句之随机查询记录和批量插入--基于mysql的更多相关文章
- MySQL 5.6 记录 SQL 语句与慢查询
环境: MySQL 如果需要记录 MySQL 的查询语句,需要在配置文件(Linux 下为 my.cnf,Windows 下为 my.ini)中添加配置: general_log = ON gener ...
- 使用传入的总记录数实现一条sql语句完成分页查询
使用传入的总记录数实现一条sql语句完成分页查询 问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...
- mysql随机查询记录的高效率方法
mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...
- mongodb 跟踪SQL语句及慢查询收集
有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行 ./mongostat -port 端口号 ...
- [转]在Excel中使用SQL语句实现精确查询
本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...
- 在JDBC中实现SQL语句的模糊查询
在JDBC中实现SQL语句的模糊查询 在大多数情况下我们可以在JDBC中写入sql语句通过占位符的方式来直接查询,但是如果要进行模糊查询,需要转义字符才能够正常查询. sql语句: select * ...
- 使用SQL语句的子查询批量复制表数据
批量复制表数据这里有两种方法,下面分别来介绍这两种方法: 一.手动创建新表,然后复制数据 如果是要复制整个表的话,可以使用SQL SERVER自动生成CREATE脚本: 然后在脚本中改改表名就可以了, ...
- mysql rand随机查询记录效率
一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的 ...
- SQL语句:子查询
一,子查询定义: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 但并不是每个位置嵌套子 ...
随机推荐
- 【读书笔记】iOS-网络-解析响应负载
Web Service可以通过多种格式返回结构化数据, 不过大多数时候使用的是XML与JSON.也可以让应用只接收HTML结构的数据.实现了这些Web Service或是接收HTML文档的应用必须能解 ...
- mysql数据库操作指令
数据库相关 查询所有数据库 show databases; 创建数据库 create database 数据库名: 创建数据库指定字符集 create database 数据库名 character ...
- SD从零开始21-24
[原创]SD从零开始21 输出(Output) 销售的输出类型Output types in SD Output是用于和商业伙伴及系统交换信息的通信方式:你可以为不同的销售凭证如报价单,订单,交货单, ...
- AJAX四种跨域处理方法
同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...
- Python环境下如何安装爬虫需求的一些库
是在CMD环境下的: request库pip install request 回车 pandas库 同理,pip install pandas :这里需要声明下,这个是不一定成功的,刚入门稍微看了一点 ...
- python2编码的问题
1,python2的默认编码是ascii码. 2,python2中有2中数据模型来支持字符串这种数据类型,分别为str和unicode. 3,uncode转换为其他编码是encode,其他编码转换成u ...
- The attribute required is undefined for the annotation type XmlElementRef
异常描述: 几天没用的项目导进Eclipse中发现有异常 public class BooleanFeatureType extends FeatureBaseType{ @XmlElementRef ...
- scaffold-dbcontext 命令使用说明
工具的scaffold-dbcontext(数据库上下文脚手架)指令来生成models和context. 指令详细介绍: Scaffold-DbContext [-Connection] <St ...
- Visual Studio 2012自动添加注释(如版权信息等)
转自:http://blog.163.com/guohuan88328@126/blog/static/69430778201381553150156/ 如何使用Visual Studio 2012给 ...
- python 多进程 Event的使用
Event事件 多进程的使用 通俗点儿讲 就是 1. Event().wait() 插入在进程中插入一个标记(flag) 默认为 false 然后flag为false时 程序会停止运 ...