本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的: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. 用venv 配置不同的开发环境

    首先使用pip 命令安装 pip install virtualenv   (以下是使用win10 操作系统) 1: 在工作目录下创建一个文件夹 mkdir mypython_space 2:然后执行 ...

  2. LeetCode题解之Max Consecutive Ones

    1.题目描述 2.问题分析 遍历一次数组,以每个1 为起点向后数,数到0 时比较当前1的个数和最大1 的个数,然后将遍历的起点放到当前0 的后面. 3.代码 int findMaxConsecutiv ...

  3. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析 (转载)

    在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...

  4. [zz]VC2005-应用程序正常初始化失败-0xc0150002

    最近几天被这个问题困惑了许久. 不禁感叹微软的东东真是越做越烂了,也终于明白了时隔12年大家仍然死守VC6的原因.. 用VC2005编译的程序,编译时没有任何错误,但是运行时就是提示“应用程序正常初始 ...

  5. eclipse neon配置tomcat8无法显示默认页面解决方法

    下载对应tomcat8版本到本地后,在eclipse中添加tomcat8的对应目录,输入http://localhost:8080时无法显示tomcat的index.jsp页面(会显示404页面).原 ...

  6. Python通过LDAP验证、查找用户(class,logging)

    定义一个类,用于初始化ldap连接,验证.查找用户等功能 # -*- coding: UTF-8 -*- import sys reload(sys) sys.setdefaultencoding(' ...

  7. NXlog配置

    NXlog文档: http://nxlog.org/docs/nxlog-ce/nxlog-reference-manual.html https://nxlog.org/documentation/ ...

  8. 3.1Python的判断选择语句

    返回总目录 目录: 1.if单分支语句 2.if else 双分支语句 3.if elif ...else多分支语句 4.if 嵌套语句 判断语句总览: (一)if单分支语句: 语法: if 条件: ...

  9. JFreeChart绘制XY折线图(工具类设计)

    准备用Java写通信的仿真平台作为毕业设计,相比matlab绘图,Java绘图需要自己去写很多工具类,博主在这采用了JFreeChart的开源解决方案,摸索着自己写了一个XY折线图工具类,话不多说贴源 ...

  10. 打开Excel时提示“向程序发送命令时出现问题”

    Excel界面中点击“文件”,选择“选项”,在弹出的“Excel选项”对话框中依次点击“高级”-“常规”,然后取消勾选”忽略使用动态数据交换(DDE)的其他应用程序”: