分享一个MySQL行列转换的方法

面试的时候,面试官要求写一个mysql行列转换的方法,当时,真不知道该怎么做,结果还是写了一个方法,建表,一条一条的转过去…真是煞费苦心呢…不过面试官也没有要求要怎么做,只要实现就欧啦,哈哈,这不…哈哈哈

好了,进入正题,今天在写一个sql,觉得好复杂,于是问了旁边一个大神,大神一看,诶,这涉及到行列转换…当时,我突然一个激灵,什么意思,怎么转,于是就有了下面的方法!

先看题,有张表如下图:

MySQL行列转换 - 列表

通过无论什么方法…转换成下面的列表,也就是行列转换,最好是SQL和JAVA都写出来!!!

MySQL行列转换 - 列表

继续阅读

Java修道之路:Java实现排名

前一篇文章《Java修道之路:MySQL排名》写了如何用SQL来实现排名,这里想用java写一下排名算法,其实主要是想了解下两种方法的耗时,因为之前有同事说SQL的耗时会比Java少,所以想测试一下。

这里先说结果,我写的方法,测出来的结果,Java会比SQL快,也许是我的SQL写得并不优导致的,但是SQL一旦成形,就可以直接套用,使用比较方便,速度呢,1万条数据耗时相差无几,10万条数据(2个字段)耗时相差也就600毫秒左右。

继续阅读

Java修道之路:MySQL排名

mysql没有oracle那种排名函数,就只有自己实现,要么用sql,要么用java。

前几天研究了下sql的写法,贴出来,怕忘了可以瞄上一眼。

这里用到了mysql的自定义变量,写法如 @rank := 0,就是设置变量rank初始值为0。

为了测试sql,要有数据,用存储过程添加了1万条数据,花了大概13秒钟吧。

在公司测试的是10万条数据,花了110多秒钟吧,具体记不得了…

好了,下面开始贴代码:

1,随机生成1万条数据的sql,表只有两个字段:id和score,id自增,score随机0~100

-- 创建存储过程
drop procedure if exists proc;
create procedure proc() 
begin 
	declare i int;
	set i = 0;
	while i < 10000 do 
		insert into score values (null, format(rand() * 100, 0));
		set i = i + 1;
	end while;
end;

-- 执行存储过程
call proc();

继续阅读

Java修道之路:写一个小小的BUG修复

终于进入项目了,算是慢慢的按照计划步入正轨了吧….开森的同时,问题也接踵而至,这周连续4天加班到快12点了才回去,而我知道这仅仅只是个开始…

刚接到的项目时,觉得应该挺简单,但是花了两周的时间做出来的——却是一坨屎!!!完全不是自己想象的那样,过程也是极其坎坷的。有时候在想,是不是自己又错了!可是回想起决定转行时,这样的情况也是早有觉悟的了,所以,感叹归感叹,路还是要继续的…

感慨完了,说说这个BUG吧。

程序是这样的,后台用JFinal搭建,业务层处理完逻辑后,返回一个Map<String,Object>给控制层,控制层通过renderJson方法返回json数据到浏览器。

Map里的数据是从数据库获取的,当时有个数据作为Map的key值,字符串打印出来看起来是:123456,可是返回到浏览器,用js获取到该key值后,用console.log打印到控制台,却变成了这个样子:”123456 ”

就是说多出了一对引号,导致js无法通过后台传过来的这个key获取到对应的value…当时就懵逼了,其他的key值都没有问题,就这个key值有问题…后来仔细观察,发现123456除了多出一对引号外,数字末尾还多了一个空格!!!一个空格!!!空格!!!格!!!

我去,怪不得会多出一对引号,因为不用引号无法表示这个空格是不是属于这个字符串的…当时发现这个问题时,只有两个字出现在脑海中久久不能散去——坑爹!

话说存数据的时候没有trim的吗?唉,不过既然问题找到了,那么就自己将取出的数据trim一次,然后再renderJson吧,于是问题解决了…庆幸自己是个仔细的人,没有被坑太久。

PS:刚开始写这篇文章的时候,脑子里一直在想一句话,就是“路漫漫其修远兮,吾将上下而求索”,不正是说的我吗!