本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的: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施主的作品到底是如何丢失的,现在还是毫无头绪,江湖中的哪位大侠、高手有看出其中破绽的希望能给在下指点一二。


版权所有,江湖中的弟兄若看得上在下的招式拳谱尽管拿走,注明招式版权、来源链接即可。

参考资料:

mysql随机获取一条或者多条数据 

sql语句之随机查询记录和批量插入--基于mysql的更多相关文章

  1. MySQL 5.6 记录 SQL 语句与慢查询

    环境: MySQL 如果需要记录 MySQL 的查询语句,需要在配置文件(Linux 下为 my.cnf,Windows 下为 my.ini)中添加配置: general_log = ON gener ...

  2. 使用传入的总记录数实现一条sql语句完成分页查询

    使用传入的总记录数实现一条sql语句完成分页查询     问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...

  3. mysql随机查询记录的高效率方法

    mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...

  4. mongodb 跟踪SQL语句及慢查询收集

    有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行  ./mongostat -port 端口号  ...

  5. [转]在Excel中使用SQL语句实现精确查询

    本文转自:http://blog.sina.com.cn/s/blog_5fc375650102e1g5.html 今天在微博上看到@数据分析精选 分享的一篇文章,是关于<在Excel中使用SQ ...

  6. 在JDBC中实现SQL语句的模糊查询

    在JDBC中实现SQL语句的模糊查询 在大多数情况下我们可以在JDBC中写入sql语句通过占位符的方式来直接查询,但是如果要进行模糊查询,需要转义字符才能够正常查询. sql语句: select * ...

  7. 使用SQL语句的子查询批量复制表数据

    批量复制表数据这里有两种方法,下面分别来介绍这两种方法: 一.手动创建新表,然后复制数据 如果是要复制整个表的话,可以使用SQL SERVER自动生成CREATE脚本: 然后在脚本中改改表名就可以了, ...

  8. mysql rand随机查询记录效率

    一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的 ...

  9. SQL语句:子查询

    一,子查询定义: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 但并不是每个位置嵌套子 ...

随机推荐

  1. C# Newtonsoft.Json反序列化为dynamic对象之后的使用

    通过Newtonsoft.Json将一个json类型的字符串反序列化为dynamic后直接使用报错 源代码: namespace ConsoleApplication1 { class Program ...

  2. mongodb基础环境搭建

    一.准备工具 (1)mongodb(https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus- ...

  3. Tracing 在PeopleSoft 程序中怎么开启

    本文介绍一些常用的跟踪方法在Applications,Application Engine,PeopleSoft,Integration Broker,Cobol中. 1.Application En ...

  4. vue-cil 中的配置分析

    自己写过配置分析,但是看了这位同学的文章之后发现写的比我全和细,索性直接转载过来了. 转自http://www.cnblogs.com/libin-1/p/6596810.html

  5. VMware Linux下拖拽补丁vmtools的安装和卸载

    Linux下拖拽补丁vmtools的安装和卸载 by:授客 QQ:1033553122 Vmware 8.0.4为例子 步骤1.VM->Install Vmware Tools... 步骤2.查 ...

  6. Go语言包管理工具dep

    什么是dep? dep和go,在一定程度上相当于maven之于Java,composer之于PHP,dep是go语言官方的一个包管理工具. 相比较go get而言,dep可以直接给引入的第三方包一个专 ...

  7. linux 下查看外网ip

    1. curl ipinfo.io ~/codes/qt_codes/qt-5.4.1-build$ curl ipinfo.io{  "ip": "114.241.21 ...

  8. [CENTOS7] 将域群组加入到Sudoer里

    文章来源:https://derflounder.wordpress.com/2012/12/14/adding-ad-domain-groups-to-etcsudoers/ Adding AD d ...

  9. percona pt toolkit 总结

    ##=====================================================##pt-osc之工作流程:1.检查更改表是否有主键或唯一索引,是否有触发器2.检查修改表 ...

  10. Go 在 TiDB 的实践

    https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/79215751 更多TiDB链接: https://my.oschina.net/z ...