SELECT 员工.员工代号, 员工.姓名, 员工.年龄, 科室.科室名称, SUM(考勤.迟到) AS 迟到次数, SUM(考勤.迟到 XOR 1) AS 准时次数 FROM 员工信息 员工 LEFT JOIN 考勤明细 考勤 ON 员工.员工代号=考勤.员工代号 LEFT JOIN 科室明细 科室 ON 员工.科室代码=科室.科室代码 WHERE 员工.姓名 RLIKE('EDIT->TEXT')EDIT->TEXT为空时,可以返回所有员工的统计资料 为了方便大家看,所以用了中文做字段和表名.
一个用户ID对应的姓名,年龄和科室都是唯一的,那么没必要在一个SQL里把姓名,年龄和科室也做为分组的一项,而且这样需要几个表关联,要做巨大的运算,而绝大部分的运算都是无谓的,必然影响效率,可以先单对考勤表以用户ID作为分组条件统计: SELECT 员工代号, SUM(考勤.迟到) AS 迟到次数, SUM(考勤.迟到 XOR 1) AS 准时次数 FROM 考勤;这样的统计基本立刻就完了,再把统计结果放入一个临时表,然后临时表和另两个表之间关联以得到你想要的结果。没了统计,后者也是很快的,这样看能不能达到你的目的。
A:先谈效率问题.正如 seakingx(抗日统一联盟:亚龙湾) 所述 MySQL 如果在 Group By 时不能使用合理的索引. 那速度将是慢得惊人的.建议修改以下启动参数key_buffer_size max_heap_table_size sort_buffer record_buffer join_buffer_size myisam_sort_buffer_size net_buffer_length tmp_table_size B: 本楼主问题的建议考勤明细表 建议表结构序号 int 主键自动增加, 员工代号 int 索引, 打卡时间 datetime, 状态 tinyint(上班或是下班)然后新建一个月统计表. 每个月对 考勤明细表 进行一次统计后.加入到月统计表中
临时表我建立过了,读入4万记录进临时表也很慢阿。CPU资源100,如何降低它的占用率?回bierhoff,存储过程没有试过,我会试试看得
考勤明细表中 员工代号 迟到 分别作一个索引先处理考勤明细表,生成临时表, 然后在把这个临时表和其他表对应
建议你把mysql的配置文件[如:my.ini]配置为medium模式,在适当修改一下相应的缓存,问题应该不大的
一定要用索引,有无索引好多时候是几十倍的差异
FROM 员工信息 员工
LEFT JOIN 考勤明细 考勤 ON 员工.员工代号=考勤.员工代号
LEFT JOIN 科室明细 科室 ON 员工.科室代码=科室.科室代码
WHERE 员工.姓名 RLIKE('EDIT->TEXT')EDIT->TEXT为空时,可以返回所有员工的统计资料
为了方便大家看,所以用了中文做字段和表名.
SELECT 员工代号, SUM(考勤.迟到) AS 迟到次数, SUM(考勤.迟到 XOR 1) AS 准时次数
FROM 考勤;这样的统计基本立刻就完了,再把统计结果放入一个临时表,然后临时表和另两个表之间关联以得到你想要的结果。没了统计,后者也是很快的,这样看能不能达到你的目的。
那速度将是慢得惊人的.建议修改以下启动参数key_buffer_size
max_heap_table_size
sort_buffer
record_buffer
join_buffer_size
myisam_sort_buffer_size
net_buffer_length
tmp_table_size
B:
本楼主问题的建议考勤明细表 建议表结构序号 int 主键自动增加,
员工代号 int 索引,
打卡时间 datetime,
状态 tinyint(上班或是下班)然后新建一个月统计表.
每个月对 考勤明细表 进行一次统计后.加入到月统计表中