起因是我们睡眠组做实验之前,需要被试者填一堆量表,诸如匹茨堡睡眠质量指数量表之类的,多半都是一堆选择题,每个题对应不同的权值,需要算最后的总分,boss让我弄这个,弄了两周后,差不多搞定,总结如下:
被试者填的答案全部在以‘PartTwo’+他们的身份证号的表里(注意,这里并不是所有的信息在固定的一张表里,所以这也就导致了我后来需要使用动态SQL语句)字段名分别是 ID , formid (因为有很多表,分别按顺序排下来) ,questionid ,answer ;
为了计算总分,我弄了一个权值表weight,字段名分别是ID ,formid ,qid, answer ,value ,在这张表里存进了每个选项对应的权值,然后通过select sum(value)得到总分,存储过程如下:
DELIMITER $$
CREATE DEFINER=`question`@`%` PROCEDURE `score`(in tname varchar(300),in formid2 int(4),out score int(10))
begin
SET @sqlcmd = CONCAT('select sum(value) into @score from weight a , ', tname, ' b where a.qid=b.questionid and a.answer=b.answer and a.formid=',formid2,'and b.formid=',formid2);
prepare stmt from @sqlcmd;
execute stmt;
select @score;
DEALLOCATE PREPARE stmt;
end
输入分别是表名和表的ID,输出是总分。
动态SQL:
由于开始并不知道我要查询的表名是什么,所以需要用到动态SQL,当时是学习这位朋友的例子然后写的http://blog.youkuaiyun.com/chszs/article/details/5818363。
更新安全问题:
在更新表的内容时,会出现“Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.” 这个错误
要取消这个限制,可以:
SET SQL_SAFE_UPDATES=0;然后就可以正常更新了,当然重启服务器后还是会变回来,到时候记得再改就是。
乱码与配置问题:
这个困扰了我许久,其实到现在还是未彻底解决,只能说下学到了什么东西吧。http://blog.youkuaiyun.com/ACMAIN_CHM/article/details/4174186,这位朋友是csdn上mysql的版主,写的这个关于字符集乱码的文章十分到位,可以借鉴下。
这里说几个小问题,一个是关于配置的,mysql已经到5.7了,现在安装没有了之前配置字符集的选项,需要自己去my.ini(windows下)或者my.cnf(linux下)改,(my.ini在哪呢,最新的sql5.7默认会放在programdata中,而不是网上所说的安装直属文件夹里,win8系统下这个是隐藏的,所以可以在C盘搜索这个文件)具体的就是将my.ini中的default-character-set改成=utf8,还有mysqld中加一句character-set-server=utf8,这样当你“show variables like 'char%'”时,你就可以看到都是utf8了。
修改完后需要重启服务,怎么重启呢,可以用附带的mysql notifier的restart,也可以进控制面板搜索服务,然后手动停止,启动。
怎么确定你使用的是你修改的那个配置文件呢,我用的mysql workbench,在server菜单下找management access settings 然后找system profile里的configuration file就是了。顺便说一句,之所以为这个纠结了两天,就是因为我处理的是网站的数据库,奶奶的压根没用到这个配置文件,搞的我改了无数次my.ini发现压根一点作用没有。
在改不了配置文件的情况下,要设置上面说的一堆为UTF8,用了一堆网上查的代码,其中character_set_server始终是Latin 1,最后无法用的set character_set_server=utf8这个命令,虽然重启服务后还是会变回来
Error: result consisted of more than one row
在写存储过程时出现了这个错误,是因为select into 语句有错误 ,得到的值有多行记录,如果像我一样明明需要得到的是一个值,那么就要思考是不是where后面的语句有错误了。当然如果你本来就是想查询多行记录,貌似需要用到光标。
中点时间的计算
这个是所有工作中花费时间最长的一个,并不是因为这个最难,而是因为自己见识浅薄,压根不知道sec_to_date这种函数,然后做了很多无用功。这个另外写一篇贴出来吧。
这次的工作总结差不多就是这样,这阶段的工作让我知道很多东西还是需要靠经验积累,包括计总分的思路,某些特殊功能的函数,都是需要长久的学习才能掌握,希望自己能不断进步,也许过不了几天回头看,现在的自己有多么愚蠢,亦如找完BUG后骂写代码时的自己一样。