本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的: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. ss 重新设置 端口的方法 记录

    1. 选择 ssh 进行远程登入: ssh root@服务器ip -p 端口, 事例如:ssh root@176.122.134.96 -p 28202 2. ls 展示 当前目录下的文件,看到有 s ...

  2. ActiveReports 报表应用教程 (15)---报表换肤

    在葡萄城ActiveReports报表中,可以设置报表中不同控件的样式,然后把这些样式保存到一个外部的XML文件当中,供其他报表使用.如果用户希望同一份报表以不用的外观分发,只需要简单地修改样式表单, ...

  3. Loadrunner脚本优化-参数化之关联MySQL数据库获取数据

    脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1.   安装MySQL ODBC驱动程序 O ...

  4. SQLite 数据库增删改查

    布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  5. JavaScript实现IP地址的输入框方式

    最近遇到一些这样的需求:实现一种IP地址的输入方式,就是输入3个字符或自动跳到下一个输入框内,删除的时候,一个输入框没有了字符,自动跳回上一个输入框.看到这里,相信大家都有一些想法了,没错,这种方法就 ...

  6. 简单了解Tomcat与OSGi的类加载器架构

    前言: 本次博客主要是对Tomcat与OSGi的类加载器架构,所以就需要对tomcat.OSGi以及类加载机制有所了解 类加载可以在http://www.cnblogs.com/ghoster/p/7 ...

  7. Unity[C#] Reflection Use

      Reflection Reflection是C#程序员的一个最有力工具 最常用的例子来说明反射的用处是一个插件系统.假设你正在创建一个 接受用户创建 的扩展程序,有没有办法预先知道哪些方法这个扩展 ...

  8. November 04th, 2017 Week 44th Saturday

    It does not do to dwell on dreams and forget to live. 整天沉溺于梦想而忘记如何好好生活,毫无意义. Bingo, and I think it i ...

  9. windows 2012 抓明文密码方法

    windows 2012 抓明文密码方法 默认配置是抓不到明文密码了,神器mimikatz显示Password为null Authentication Id : 0 ; 121279 (0000000 ...

  10. 解决Windows Server2008 R2中IE开网页时弹出阻止框

    使用Windows Server2008,用IE打开网站时会弹出“Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容”的对话框.如下图所示: 2011-10-14_ ...