存储过程:
BEGIN
 declare countj   int; 
 SELECT COUNT(serverid) INTO countj FROM `count_serverinfo` WHERE gameid = temgameid ORDER BY serverid,days;
BEGIN
     INSERT into daydate(game1,serverorder,serverid,days)
     SELECT game,serverorder,serverid,MAX(IF(days=temdays,amountcount,0.00)) AS days FROM count_serverinfo GROUP BY serverid ORDER BY serverid DESC;
END;
ENDphp文件中的代码:
$day = $db->query("SELECT days FROM `count_serverinfo` WHERE gameid = '1' GROUP BY days asc ");
foreach($day as $key=>$days){
  $db->getAll("set @temgameid='1',@temdays='".$days['days']."'");
  $sql="call dier(@temgameid,@temdays)";
  $db->getAll($sql);  
}这个值temdays我在php文件中从一张表里边查询出来了,然后遍历,比如说这个变量有10个值是在存储过程中循环了10次,但是插入到daydate表中的值全都是第一天的数据,为什么啊

解决方案 »

  1.   

    检查SP中@temgameid,@temdays 的值是否传入
    SELECT 变量名
      

  2.   

    SP代码是什么
    贴建表及插入记录的SQL
    5-6条记录即可
      

  3.   

    存储过程代码:
    BEGIN
      declare countj   int;
     SELECT COUNT(serverid) INTO countj FROM `count_serverinfo` WHERE gameid = temgameid ORDER BY serverid,days;
     BEGIN
         INSERT into daydate(game1,serverorder,serverid,days)
     SELECT game,serverorder,serverid,MAX(IF(days=temdays,amountcount,0.00)) AS days FROM count_serverinfo GROUP BY serverid ORDER BY serverid DESC;
     END;
    END建表:CREATE TABLE `daydate` (
      `game1` varchar(20) DEFAULT NULL,
      `serverorder` int(11) DEFAULT NULL,
      `serverid` int(11) DEFAULT NULL,
      `days` int(11) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk;表中的数据:INSERT INTO `daydate` VALUES ('帝国文明', '9', '18', '2940');
    INSERT INTO `daydate` VALUES ('帝国文明', '8', '17', '3525');
    INSERT INTO `daydate` VALUES ('帝国文明', '7', '10', '2945');
    INSERT INTO `daydate` VALUES ('帝国文明', '6', '9', '2555');
    INSERT INTO `daydate` VALUES ('帝国文明', '5', '7', '1620');
    INSERT INTO `daydate` VALUES ('帝国文明', '4', '5', '1030');
    INSERT INTO `daydate` VALUES ('帝国文明', '3', '3', '320');
    INSERT INTO `daydate` VALUES ('帝国文明', '2', '2', '530');
    INSERT INTO `daydate` VALUES ('帝国文明', '1', '1', '155');
      

  4.   

    foreach($day as $key=>$days){
      $sql="call dier('1','".$days['days']."')";
      $db->getAll($sql);   
    }
      

  5.   

    mySQL Query Error
        Date: 2012-7-12 16:14:11
        SQLID: OUT or INOUT argument 1 for routine my6543db.dier is not a variable or NEW pseudo-variable in BEFORE trigger
        Error: call dier('1','1')
      

  6.   

    存储过程完整代码,
    CREATE PROCEDURE 
    在MYSQL中测试,结果如何
      

  7.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `diera`;
    CREATE DEFINER=`root`@`localhost` PROCEDURE `dier`(
    INOUT temdays INT,
    IN temgameid INT,
    )
    BEGIN
      DECLARE countj INT; 
      SELECT COUNT(DISTINCT(days)) INTO countj FROM `count_serverinfo` WHERE gameid = '",gameid,"';
     BEGIN
         INSERT into daydate(i,game1,serverorder,serverid,day1)
         SELECT game,serverorder,serverid,MAX(IF(days='",days,"',amountcount,0.00)) AS '",days,"' FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC;
     END;
    END $$
    DELIMITER ;
      

  8.   

    set @temgameid='1',@temdays='1';
    call dier(@temgameid,@temdays) 我这样在mysql中运行,查出来的数据正确啊,我把sql输出,我限制了只循环两次,你看他就出来了两条sql语句,而且这个temdays值也是变化的,
    但是在存储过程中显示的虽然是两次查询结果,但都是第一天的数据
    set @temgameid='1',@temdays='1'
    call dier(@temgameid,@temdays)
    set @temgameid='1',@temdays='2'
    call dier(@temgameid,@temdays)
      

  9.   

    我估计问题出在
    SELECT game,serverorder,serverid,MAX(IF(days='",days,"',amountcount,0.00)) AS '",days,"' FROM count_serverinfo GROUP BY serverid ORDER BY 
    这句上,上个帖子已经说过,要用字符串累加生成SQL语句,再执行的方法SET @asql='SELECT game,serverorder,serverid,';
    SET @asql=CONCAT(@asql,'MAX(IF(days=\'',days,'\',amountcount,0.00)) AS `',days,'`');....
    prepare stml from @asql;
    execute stml;MAX(IF(days='",days,"',amountcount,0.00))
    看看days中的值,你是否要计算比如days=‘01’ OR 02的值MAX(IF(days='01',amountcount,0.00))
    这2句是否有区别
      

  10.   

    你的存储过程中哪儿用到了这两个参数?
    INOUT temdays INT,
    IN temgameid INT,
      

  11.   

    不好意思,我这是又写了一次存储过程:sql语句中的两个变量忘记修改了,,
    SELECT COUNT(DISTINCT(days)) INTO countj FROM `count_serverinfo` WHERE gameid = '",gameid,"';
    这句中gameid=temgameid
    SELECT game,serverorder,serverid,MAX(IF(days='",days,"',amountcount,0.00)) AS '",days,"' FROM count_serverinfo GROUP BY serverid ORDER BY  
    这句中:days='",days,"', 后边的days=temdays 
      

  12.   

    你的代码是什么?建议你看看MYSQL的HELP、及我的示例进行修改
      

  13.   

    直接贴出你的 create procedure 语句,否则别人根本不知道你的语句是什么。
      

  14.   

    我都这样写了,还是一个样子啊,真蛋疼啊
    SET @asql='INSERT into daydate(game1,serverorder,serverid,days)';
    SET @asql=CONCAT(@asql,'SELECT game,serverorder,serverid,');
    SET @asql=CONCAT(@asql,'MAX(IF(days=\'',temdays,'\',amountcount,0.00)) AS `',temdays,'`FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC');
      

  15.   

    BEGIN
      declare countj   int;
     SELECT COUNT(serverid) INTO countj FROM `count_serverinfo` WHERE gameid = temgameid ORDER BY serverid,days;
     BEGIN
         SET @asql='INSERT into daydate(game1,serverorder,serverid,days)';
     SET @asql=CONCAT(@asql,'SELECT game,serverorder,serverid,');
     SET @asql=CONCAT(@asql,'MAX(IF(days=\'',temdays,'\',amountcount,0.00)) AS `',temdays,'`FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC');
    prepare stml from @asql;
    execute stml;
    deallocate prepare stml;
    END;
    END
      

  16.   

     为什么不肯贴你完整的语句啊?你的 create procedure 在哪儿?
      

  17.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `diera`;
    CREATE DEFINER=`root`@`localhost` PROCEDURE `dier`(
    INOUT temdays INT,
    IN temgameid INT,
    )
    BEGIN
      DECLARE countj INT; 
      SELECT COUNT(DISTINCT(days)) INTO countj FROM `count_serverinfo` WHERE gameid = '",temgameid,"';
    BEGIN
      INSERT into daydate(i,game1,serverorder,serverid,day1)
      SELECT game,serverorder,serverid,MAX(IF(days='",temdays ,"',amountcount,0.00)) AS '",days,"' FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC;
    END;
    END $$
    DELIMITER ;
      

  18.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `diera`;
    CREATE DEFINER=`root`@`localhost` PROCEDURE `diera`(
    INOUT temdays INT,
    IN temgameid INT,
    )
    BEGIN
      DECLARE countj INT; 
      SELECT COUNT(DISTINCT(days)) INTO countj FROM `count_serverinfo` WHERE gameid = ",temgameid,"';
    BEGIN
      INSERT into daydate(i,game1,serverorder,serverid,day1)
      SELECT game,serverorder,serverid,MAX(IF(days='",temdays ,"',amountcount,0.00)) AS '",days,"' FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC;
    END;
    END $$
    DELIMITER ;
      

  19.   

     SELECT game,serverorder,serverid,MAX(IF(days=temdays,amountcount,0.00))  FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC;
      

  20.   

    SET @asql=CONCAT(@asql,'MAX(IF(days=\'',temdays,'\',amountcount,0.00)) AS `',temdays,'`FROM count_serverinfo GROUP BY serverid ORDER BY serverorder DESC');
    SELECT @ASQL;
    贴结果
      

  21.   

    报错:
    mySQL Query Error
        Date: 2012-7-13 09:44:22
        SQLID: Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
        Error: set @temgameid='1',@temdays='2'
      

  22.   

    直接在MYSQL环境中运行,确定是否是SP的问题