我这里有几张表,我需要对这张表进行多表联合查询出我需要的数据放到另一张表A中,然后我又要对表A进行一些数据处理,计算出“处理时间”和“平均处理时间”同时放到表B中,然后通过C#的DATAGRIDVIEW对表B进行绑定在前台显示。等一个人用完之后把表A和表B都删除掉。问题是现实使用中有很多人同时使用这个软件,同时好几个人创建和删除这个表A和表B,就会出错,也会造成查询结果不真实。这些如果是MSSQLSERVER完全可以通过临时表来处理,但现在的问题是我使用的说MYSQL数据库,MYSQL的数据库不支持在临时表里使用虚拟表 (也就是不能使用类似 select * from table a left join table2 b……这样的虚拟子表查询)。 请问大家是如何处理这种问题的?
提示
You cannot refer to a TEMPORARY table more than once in the same query
我这里有几张表,我需要对这张表进行多表联合查询出我需要的数据放到另一张表A中,然后我又要对表A进行一些数据处理,计算出“处理时间”和“平均处理时间”同时放到表B中,然后通过C#的DATAGRIDVIEW对表B进行绑定在前台显示。等一个人用完之后把表A和表B都删除掉。问题是现实使用中有很多人同时使用这个软件,同时好几个人创建和删除这个表A和表B,就会出错,也会造成查询结果不真实。这些如果是MSSQLSERVER完全可以通过临时表来处理,但现在的问题是我使用的说MYSQL数据库,MYSQL的数据库不支持在临时表里使用虚拟表 (也就是不能使用类似 select * from table a left join table2 b……这样的虚拟子表查询)。 请问大家是如何处理这种问题的?这是创建表存储过程,不过我说用真实表来做的:
CREATE PROCEDURE `flow_report4`()
begin
DROP TABLE IF EXISTS test4;
CREATE TABLE test4(id INT not null AUTO_INCREMENT primary key) (
SELECT a.* ,
b.avg_time
FROM ( SELECT a.* ,
IFNULL(CONCAT(LTRIM(DATEDIFF(a.DELIVER_TIME, b.DELIVER_TIME) ) , '天' , LTRIM(HOUR( TIMEDIFF(a.DELIVER_TIME, b.DELIVER_TIME))mod 24 ) , '小時',LTRIM(MINUTE(TIMEDIFF(a.DELIVER_TIME, b.DELIVER_TIME)) ), '分钟'), '') AS deal_time
FROM test2 a
LEFT JOIN test2 b ON a.run_id = b.run_id AND a.id2 = b.id2 +1
) a
LEFT JOIN ( SELECT a.user_NAME ,
CONCAT(IFNULL( ROUND(AVG(HOUR(TIMEDIFF(a.DELIVER_TIME, b.DELIVER_TIME)) ),2) , 0),'小时') AS avg_time
FROM test2 a LEFT JOIN test2 b ON a.flow_id = b.flow_id AND a.id2 = b.id2 + 1
GROUP BY a.user_NAME
) b
ON a.user_NAME = b.user_NAME
);
end
还有经过这样一系列处理之后,查询数据库很慢,有什么好的方法,我创建表的同时已经创建了索引了的。
想把那句select语句选择出来的东西插入临时表
CREATE PROCEDURE Create_table2(pro_name VARCHAR(50))
BEGIN
DROP TABLE if EXISTS pro_name;
CREATE TABLE pro_name (id2 INT not null AUTO_INCREMENT primary key) (
SELECT a.run_id,c.run_name,c.flow_id,a.prcs_id , a.user_id,b.user_name,a.prcs_flag,c.end_time, a.DELIVER_TIME,d.del_flag FROM flow_run_prcs a left JOIN `user` b ON a.user_id=b.user_id left JOIN flow_run c ON a.run_id=c.run_id left JOIN flow_run d ON a.run_id=d.run_id
WHERE EXISTS(select 1 from flow_run_prcs f where f.run_id=a.run_id HAVING MAX(prcs_id)<>MIN(prcs_id) AND MIN(prcs_id)=1 ) and d.DEL_FLAG<>1
ORDER BY run_id ,prcs_id
);
END