mysql 在数据表中随机取数据或随机排序

最近遇到一个需求,就是随机取数据,本着拿来主义的精神,网上找了找,基本上都是这个下面这个内容,但是并不能让人满意:

1、select * from users order by rand() LIMIT 1

2、SELECT * FROM users  AS t1  JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1

3、SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users)  LIMIT 1

先说一下,感觉三个虽然能满足需求,但是并不完善,而且感觉上怪怪的

下面给大家说下我自己改良编号2的sql语句:

SELECT t1.* FROM table AS t1 JOIN (SELECT id,(rand()*timestamp(now())) AS rid from table where 过滤条件) as t2 where t2.id=v1.id order by v2.rid

性能:百条数据的查询速度在 0.0015s 以内

思路:先查询出需要的内容(即JOIN ()内的语句,当然我们只是需要一个随机字段rid),然后t2.id=t1.id来取到数据

---------------------------------------时间分割线-------------------------------------

还没完,就在刚才写这个的时候突然想到自己是不是傻,完全可以更简单的,那就是这样:

SELECT *,(rand()*timestamp(now())) AS rid FROM table [where 过滤条件] ORDER BY rid DESC|ASC

完全没必要在和自身去内联

性能方面绝对没得说,最基本的查询语句只不过多生成了一个随机字段(不过如果一定不要这个随机字段的话还是用上面的吧),然后order by这个随机字段。。。。

--------------------------------------有一条分割线--------------------------------------

说下自己的感受:

1、拿来主义虽然方便,但是并不万能,毕竟做技术要提升自身的能力。带着学习的眼光去抄去拿,不要只是为了完成任务去抄去拿。

2、适时的记录自身体悟说不定会有意外收获

说些题外话,我想起了上学时候的事情,大家都可能遇到过这样的事,有些同学经常抄别人的作业但是成绩还不差,有些人抄别人作业就成绩很差,我想大致原因就是如此吧,第一种的做法大概和学画画的时候的临摹,虽然是抄但是在学习,而第二种就是偷懒,大抵如此吧。

时间: 2024-10-12 16:44:46

mysql 在数据表中随机取数据或随机排序的相关文章

Mysql 如何删除数据表中的重复数据!

1.使用distinct查询所有不重复的记录 2.创建数据表相同结构的临时表,将第一步的数据复制进去 create temporary table if not exists student_temp as (select distinct(name), sex from student); 3.truncate table student; 4.insert into student(id,name,sex) select null,name,sex from student_temp; My

mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的系统默认数据,通过项目组同事仔细研究,我们得到一致的答案为:在表上新增一个触发器,当删除数据ID为 1 2 3 4 5时候,直接弹出相应的错误,采用这种模式,可以限制所有端口的异常操作(程序 查询分析器),具体实现方式,如下文所示: create trigger trTriggerA on A fo

MySQL 使用while语句向数据表中批量插入数据

1.创建一张数据表 mysql> create table test_while ( -> id int primary key) charset = utf8; Query OK, 0 rows affected (0.28 sec) 查看数据表的结构 mysql> desc test_while; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Ext

C# DataAdapter.Update() 无法更新数据表中删除的数据行

用DataAdapter.Update() 方法更新删除了部分DataRow 的 DataTable .但是数据库中的数据没有随着更新而变化. 原因:DataTable 删除 DataRow 时,使用的是DataTable.Rows.Remove(DataRow ) 或 DataTable.Rows.RemoveAt(DataRowIndex) 方法. 解决方法:使用 DataTable.Rows[rowIndex].Delete() ; 方法删除数据. 详解如下: DataAdapter.Up

Mysql update 一个表中自己的数据

update  table ucf, table t2 set ucf.pcid = t2.pcid where t2.name = 'liming' and t2.gid= ucf.gid and ucf.id in(474,475,479,482,457,375,461,406,373,374);

MySQL查询数据表中数据记录(包括多表查询)

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

MySQL 处理重复数据:防止表中出现重复数据、统计、过滤、删除重复数据

MySQL 处理重复数据 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据. 防止表中出现重复数据 你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性. 让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录. CREATE TABLE person_tbl

MySql 获取数据表中随机一条数据

通过sql语句获取数据表中的随意一条数据 -- rand() 获取0到1之间的随机浮点数 -- ((select max(id) from test) - (select min(id) from test)) * rand() 获取到随机数 -- + (select min(id) from test) 保证id为 最小ID与最大ID之间的数 select * from test where id >= ((select max(id) from test) - (select min(id)

mysql实现高效率随机取数据

从数据库中(mysql)随机获取几条数据很简单,但是如果一个表的数据基数很大,比如一千万,从一千万中随机产生10条数据,那就相当慢了,如果同时一百个人访问网站,处理这些个进程,对于一般的服务器来说,肯定是要死机的. mysql数据库获取随机数据的函数rand(),我建议轻易不要用这个,我写博客的时候试了一下,从16万数据里随机获取5条数据,用时14.02秒,这个耗费满惊人的. SELECT * FROM t_share ORDER BY rand() LIMIT 5; 通过mysql最大值函数m