我这里有几张表,我需要对这张表进行多表联合查询出我需要的数据放到另一张表A中,然后我又要对表A进行一些数据处理,计算出“处理时间”和“平均处理时间”同时放到表B中,然后通过C#的DATAGRIDVIEW对表B进行绑定在前台显示。等一个人用完之后把表A和表B都删除掉。问题是现实使用中有很多人同时使用这个软件,同时好几个人创建和删除这个表A和表B,就会出错,也会造成查询结果不真实。这些如果是MSSQLSERVER完全可以通过临时表来处理,但现在的问题是我使用的说MYSQL数据库,MYSQL的数据库不支持在临时表里使用虚拟表 (也就是不能使用类似 select * from table a left join table2 b……这样的虚拟子表查询)。 请问大家是如何处理这种问题的?

解决方案 »

  1.   

    你的临时表是如何创建的? CREATE TEMPORARY TABLE  ? 如果是这样,应该不同连接之间不会相互影响。
      

  2.   

    是这样创建的,但临时表里面不能再创建临时表,这说MYSQL的软肋
      

  3.   

    MYSQL的数据库不支持在临时表里使用虚拟表 (也就是不能使用类似 select * from table a left join table2 b……这样的虚拟子表查询)。详细说明 ,A、B是怎样建立的
      

  4.   

    mysql临时表不允许被多次引用在同一查询中
    提示
    You cannot refer to a TEMPORARY table more than once in the same query
      

  5.   

    需要实现什么功能? MYSQL是有这个限制,想办法通过其它方法来绕过去。
      

  6.   

    就说这个功能
    我这里有几张表,我需要对这张表进行多表联合查询出我需要的数据放到另一张表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 
    还有经过这样一系列处理之后,查询数据库很慢,有什么好的方法,我创建表的同时已经创建了索引了的。
      

  7.   

    建议直接描述功能,否则别人还需要花时间去理解你的代码。 比如你的这个test2 是临时表?还是正式表?
      

  8.   

    test2是正式表
    想把那句select语句选择出来的东西插入临时表
      

  9.   

    想到一个解决办法,就是创建已用户名来当表名,但是我这样写存储过程不对,创建的不是我参数指定名称的表名。
    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