mysql函数

MYSQL的随机查询的实现方法

隐身守侯 提交于 2019-12-01 21:29:08
MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。 You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。 SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.id >=

MySQL 随机取数据效率问题

南笙酒味 提交于 2019-12-01 21:28:58
最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。 You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。 SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2

mysql 怎么实现随机查询并分页,不重复查询

寵の児 提交于 2019-12-01 21:28:40
需求: 企业应用中,一般数据量不是很特别多,同时大多在局域网内,性能不会有问题,一般不会分页处理,随机排序数据一般不会有问题 web网站中,一般都用到分页处理,目前数据量比较少,考虑到数据“动态”,想随机顺序展现数据(每次看到的不一样) 方案: 数据库解决: 用mysql的select * from tab order by rand() 用rand()会用问题,会出现数据重复:从数据库的rand()和分页原理上,出现重复不可避免(分页其实对sql语句结果的分段提取,对结果集从第m条记录到第n条记录;mysql的rand()实现原理是每次sql的结果集的全部按算法打乱排序;而分页是有上下文关系的,所以可能出现某条记录出现在不同的分页中,如某条记录在第一次sql执行时,rand()排序后,在第一页,而第二次执行sql时,rand()排序后,落在第二页,这条记录在分页过程中,用了多次) 在可以容忍重复的情况下可以用,不过mysql的rand()函数效率非常低,建议用表中的主键做散列计算排序(如主键是数字类型,可求余运算来散列) 如不能容忍重复,数据库好像比较难直接解决(网站web应用又没有固定的连接,利用session id标识,建立临时表?好像不大现实) 程序解决: 第一页时,取到内存,然后翻页时,用剩余数据,比较复杂,也不大现实(标识session id,何时清理...?) 结论:

MySQL查询生日是今天的用户

瘦欲@ 提交于 2019-12-01 18:34:24
select * from customer where MONTH(birthday) = MONTH(NOW()) and DAY(birthday) = DAY(NOW()) 如题,MySQL使用函数查询生日是今天的用户 -- 还有五天要过生日的用户 select * from customer where DATEDIFF(birthday,now()) = 5 原文链接:https://blog.csdn.net/key_artist/article/details/80937934 来源: https://www.cnblogs.com/yangchong/p/11712353.html

Mysql 查询中位数

久未见 提交于 2019-12-01 17:00:35
Mysql查询平均数和众数比较简单;平均数使用AVG函数,众数分组查询之后再次统计最大值即可。 但是Mysql查询中位数就比较蛋疼,我们可以用自定义一个变量来当做行号解决这个问题。 自定义变量@ID当成行号(按照列pos排序): SET @ID=0; SELECT @ID:=@ID+1 AS ID , pos FROM alerts_ring_list WHERE 1=1 ORDER BY `pos` 最后做个子查询即可: SET @ID=0; SELECT AVG(pos) FROM ( SELECT @ID:=@ID+1 AS ID , pos FROM alerts_ring_list WHERE 1=1 ORDER BY `pos` ) a WHERE IF (@ID%2=0, ID in (ROUND(@ID/2,0),ROUND(@ID/2,0)+1), ID=ROUND(@ID/2,0)) 有了行号之后,同理,分位数可以用类似方案跑出,就不赘述了。 来源: https://www.cnblogs.com/yanximin/p/11694682.html

mysql 类型自动化转换问题

核能气质少年 提交于 2019-12-01 16:57:40
mysql 类型自动化转换问题 背景 有个业务需求,使用到find_in_set函数,简单贴下,如下: SELECT FIND_IN_SET('b','a,b,c,d'); //返回值为2,即第2个值 实际用法: select * from campaign_plan where find_in_set('4',ad_type); 参考:https://www.cnblogs.com/mytzq/p/7090197.html 无意间发现了一个这样的问题,ad _type为text类型,具体表数据如下: 执行了语句如下: 顿时三观崩了,什么情况,怎么回匹配到第一个数字呢? 解惑 询问了一个朋友,他给了一个方向,mysql会自动转换类型,当你select语句的条件和数据中的type不一致的时候; 一拍大腿,是呀,之前有碰到过类似问题,如下: 有个id是varchar,你不加‘’也可以查询出来, 应该是转换了的,但这样没走索引的,所以查询效率很低 。。 当时碰到的问题是,当数据是id='123', 你select是where id = 123,一个是int 一个是varchar,mysql会自动的'123'转为123跟你的对比 回到,我上面碰到的问题也是类似,只是有一个逗号的存在,在转换的时候会截断,实际操作如下: 所以就解释通了,三观恢复 拿了一下官方的翻译版本, 隐式类型转换规则:

C++操作Mysql数据库/Linux下

廉价感情. 提交于 2019-12-01 16:26:00
本文链接:https://blog.csdn.net/Tanswer_/article/details/72796570 想用C++写项目,数据库是必须的,所以这两天学了一下C++操作Mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是使用MySQL自己的C API函数连接数据库。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。 API函数 1.mysql_real_connect() 连接一个mysql服务器 MYSQL *mysql_real_connect (MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同 2.mysql_query() 执行指定”以NULL终结的字符串”的SQL查询 返回一个结果表,假定查询成功,可以调用

MySql计算字段的长度

前提是你 提交于 2019-12-01 15:54:28
用户账号有用中文字符,查找所有含有中文字符的账号 SELECT member_name FROM table_member WHERE length(member_name)!=char_length(member_name) LENGTH mysql里面的 “LENGTH” 函数是一个用来获取字符串长度的内置函数 CHAR_LENGTH 在mysql内置函数里面查看字符串长度的还有一个函数是 “CHAR_LENGTH”,这两个函数的区别是: LENGTH: 一个汉字是算三个字符,一个数字或字母算一个字符。 CHAR_LENGTH: 不管汉字还是数字或者是字母都算是一个字符 实例: (1)汉字 SELECT LENGTH( '字符'); 输出:6 SELECT CHAR_LENGTH( '字符'); 输出:2 (2)字符 SELECT LENGTH( 'abc'); 输出:3 SELECT CHAR_LENGTH( 'abc'); 输出:3 来源: https://www.cnblogs.com/nxmxl/p/11691484.html

Mysql排序函数

给你一囗甜甜゛ 提交于 2019-12-01 13:58:00
一、row_number row_number会为查询出来的每条记录生成一个序号,依次排序并且不会重复,row_number必须要使用over句子选择对某一列进行排序才会生成序号,row_number用法实例: select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order] row_num就是row_number函数生成的序号列,其基本原理是先使用over子句中的排序语句对记录进行排序,然后按照这个顺序生成序号。over中的order by和SQL语句中的order by没有任何的关系,这两处的order by可以完全的不同,例如下述的用法: select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order] order by [TotalPrice] desc row_number函数可以实现web程序的分页,查询制定范围内的数据,例如根据订单提交时间倒序排列获取第三至第五数据: with orderSection as ( select ROW_NUMBER() OVER(order by [SubTime] desc) rownum,* from [Order] ) select * from

mysql下实现窗口分析函数

南笙酒味 提交于 2019-12-01 13:55:32
窗口分析函数在做数据分析时十分常用,但是mysql却不支持。不过我们可以通过sql的形式实现这个功能 构造表数据 create table rank_over(id int,subid int,curd timestamp); …… insert into rank_over values(8,3,now()); insert into rank_over values(9,2,now()); 表数据如下 mysql> select * from rank_over; +------+-------+---------------------+ | id | subid | curd | +------+-------+---------------------+ | 1 | 1 | 2016-08-29 00:47:12 | | 2 | 1 | 2016-08-29 00:47:38 | | 3 | 1 | 2016-08-29 00:47:42 | | 4 | 2 | 2016-08-29 00:47:50 | | 5 | 2 | 2016-08-29 00:47:54 | | 6 | 3 | 2016-08-29 00:48:00 | | 7 | 4 | 2016-08-29 00:48:06 | | 8 | 3 | 2016-08-29 01:12:10 | | 9 | 2