2012-06-01 188 views
2

我正在构建一个网站的房地产租金。我现在正在进行搜索,我试图设置一个函数,我可以为每个属性调用。该功能需要抓取连接到给定属性的rental_periods表中的所有行,然后计算出最佳(最便宜)的每周价格。MYSQL - 函数不返回预期结果

我已经设置了下列表格。多行每个属性,与ID并列 -

properties - 每个属性

rental_periods一行。

每行是selfcateredcateredwdpd

  • WeekEndPerNight - - wepn
  • 每月价格 - monthly
  • 周价格 - wk
    • WeekDayPerDay:

      如果selfcatered价格需要在给定的价格来制定

      如果catered价格可以在给定的:

      • PerPersonPerNight - pppn
      • PerNight - pn
      • PerPersonPerWeek - pppw

      我需要一个函数,它接受一个属性ID,然后抓住各个时期那么这取决于自己承担/照顾的每周最好的价格。

      我到目前为止似乎没有工作。它要么返回NULL或返回100000.00(我的上限默认价格)。

      下面的代码

      DELIMITER $$ 
      
      
      CREATE FUNCTION get_price(myid INT) 
          RETURNS VARCHAR(20) 
      
      BEGIN 
          DECLARE done INT DEFAULT 0; 
          DECLARE price decimal(30,3) default 100000.000; 
      
          DECLARE id INT; 
          DECLARE prop_id INT; 
          DECLARE type enum('catered','selfcatered'); 
          DECLARE name varchar(45); 
      
          DECLARE `from` date; 
          DECLARE `to` date; 
      
          DECLARE currency varchar(45); 
          DECLARE so tinyint; 
          DECLARE wk decimal(30,3); 
          DECLARE wepn decimal(30,3); 
      
          DECLARE wdpd decimal(30,3); 
          DECLARE monthly decimal(30,3); 
          DECLARE extra decimal(30,3); 
          DECLARE pppn decimal(30,3); 
          DECLARE pn decimal(30,3); 
      
          DECLARE pppw decimal(30,3); 
          DECLARE minstay int; 
          DECLARE maxstay int; 
          DECLARE breakfast varchar(45); 
          DECLARE annual TINYINT; 
      
          DECLARE cur1 CURSOR FOR SELECT * FROM rental_periods WHERE prop_id = myid; 
      
          DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
      
          OPEN cur1; 
      
          REPEAT 
          FETCH cur1 INTO id, prop_id, type, name, `from`, `to`, currency, so, wk, wepn, wdpd, minstay, maxstay, monthly, extra, pppn, pn, pppw, breakfast, annual; 
      
          IF NOT done THEN 
           IF (@type = "selfcatered") THEN 
            IF (@wdpd > 0 AND (@wdpd * 7) < @price) THEN 
             SET price = @wdpd * 7; 
            END IF; 
      
            IF (@wepn > 0 AND (@wepn * 7) < @price) THEN 
             SET price = @wepn * 7; 
            END IF; 
      
            IF ((@wdpd > 0 AND @wepn > 0) AND 
            (@wdpd * 5 + @wepn * 2) < @price) THEN 
             SET price = @wdpd * 5 + @wepn * 2; 
            END IF; 
      
            IF (@monthly > 0 AND (@monthly/(52/12)) < @price) THEN 
             SET price = @monthly/(52/12); 
            END IF; 
      
            IF (@wk > 0 AND @wk < @price) THEN 
             SET price = @wk; 
            END IF; 
           ELSE 
            IF (@pppn > 0 AND (@pppn * 7) < @price) THEN 
             SET price = @pppn * 7; 
            END IF; 
      
            IF (@pn > 0 AND (@pn * 7) < @price) THEN 
             SET price = @pn * 7; 
            END IF; 
      
            IF (@pppw > 0 AND (@pppw) < @price) THEN 
             SET price = @pppw; 
            END IF; 
           END IF; 
          END IF; 
          UNTIL done END REPEAT; 
      
          CLOSE cur1; 
      
          RETURN price; 
      END $$ 
      

      我希望/不完蛋了与我怎么安排的呢,还是我缺乏纯粹的MySQL的一些愚蠢的事。

      任何帮助将是非常有帮助的。

      编辑:

      下面是rental_periods为例行:

      INSERT INTO `rental_periods` (`id`, `prop_id`, `type`, `name`, `from`, `to`, `currency`, `so`, `wk`, `wepn`, `wdpd`, `minstay`, `maxstay`, `monthly`, `extra`, `pppn`, `pn`, `pppw`, `breakfast`, `annual`) 
      VALUES (64732, 32, 'selfcatered', 'Summer', '2012-06-01', '2012-08-31', NULL, 1, '350', '60', '100', '', '', '', '', NULL, NULL, NULL, NULL, 0); 
      

      我期望的函数返回350从每周柱回升。但如果wepn是30,而不是60,我期望210回来(从7 * wepn价格计算)。

      在SP代码IM测试:

      DELIMITER $$ 
      
      
      CREATE procedure tmp_get_price(myid INT) 
      
      BEGIN 
      
          DECLARE done INT DEFAULT 0; 
      
      
          DECLARE price decimal(30,3) default 100000.000; 
      
      
          DECLARE id INT; 
          DECLARE prop_id INT; 
          DECLARE type enum('catered','selfcatered'); 
          DECLARE name varchar(45); 
      
          DECLARE `from` date; 
          DECLARE `to` date; 
      
          DECLARE currency varchar(45); 
          DECLARE so tinyint; 
          DECLARE wk decimal(30,3); 
          DECLARE wepn decimal(30,3); 
      
          DECLARE wdpd decimal(30,3); 
          DECLARE monthly decimal(30,3); 
          DECLARE extra decimal(30,3); 
          DECLARE pppn decimal(30,3); 
          DECLARE pn decimal(30,3); 
      
          DECLARE pppw decimal(30,3); 
          DECLARE minstay int; 
          DECLARE maxstay int; 
          DECLARE breakfast varchar(45); 
          DECLARE annual TINYINT; 
      
      
      
          DECLARE cur1 CURSOR FOR SELECT id, prop_id, type, name, `from`, `to`, currency, so, wk, wepn, wdpd, minstay, maxstay, monthly, extra, pppn, pn, pppw, breakfast, annual FROM rental_periods WHERE prop_id = myid; 
          DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
      
          OPEN cur1; 
      
      
          REPEAT 
          FETCH cur1 INTO id, prop_id, type, name, `from`, `to`, currency, so, wk, wepn, wdpd, minstay, maxstay, monthly, extra, pppn, pn, pppw, breakfast, annual; 
      
      
          IF NOT done THEN 
          IF (type = "selfcatered") THEN 
      
           IF (wdpd > 0 AND (wdpd * 7) < price) THEN 
            SET price = wdpd * 7; 
           END IF; 
      
      
           IF (wepn > 0 AND (wepn * 7) < price) THEN 
            SET price = wepn * 7; 
           END IF; 
      
      
           IF ((wdpd > 0 AND wepn > 0) AND 
            (wdpd * 5 + wepn * 2) < price) THEN 
            SET price = wdpd * 5 + wepn * 2; 
           END IF; 
      
      
           IF (monthly > 0 AND (monthly/(52/12)) < price) THEN 
            SET price = monthly/(52/12); 
           END IF; 
      
      
           IF (wk > 0 AND wk < price) THEN 
            SET price = wk; 
           END IF; 
          ELSE 
           IF (pppn > 0 AND (pppn * 7) < price) THEN 
            SET price = pppn * 7; 
           END IF; 
      
           IF (pn > 0 AND (pn * 7) < price) THEN 
            SET price = pn * 7; 
           END IF; 
      
           IF (pppw > 0 AND (pppw) < price) THEN 
            SET price = pppw; 
           END IF; 
          END IF; 
      
      
          END IF; 
          UNTIL done END REPEAT; 
      
          CLOSE cur1; 
      
          select price; 
      END $$ 
      

      仍然不工作... :(我是不是傻了无法看到为什么这不会工作.. 得到时期..?!? 。 去throught每一个... 如果价格更低设置.... 选择价格....?!?

      ,如果我把多选择在...例如光标内。 只有最下面的一个火灾和返回100000.000

      我设置的所有值字段,小数和不允许空...

      任何想法,当我去错了...?也尝试通过插入到日志表中进行调试...从来没有触发..?!

    +1

    当我在搞清楚我的存储过程所走的路径问题,我加上'PRINT(1 ,2,3等)在控制流程中的语句,以及一路打印出某些变量的值。这可能有助于未来。 (对于MySQL,您应该可以'SELECT(1,2,3)'。) –

    +0

    检查以确保光标中的列与您的变量保持一致。您可能想要为每列指定名称,而不是使用'select *'。 - >并且做什么@AdamV说< - – ethrbunny

    +0

    你能给我们一行数据,以及你期望它返回什么,所以我们可以通过你的程序来看看它为什么不匹配? –

    回答

    0

    需要阅读更多有关游标这个接缝一个很好的开始...

    http://www.kbedell.com/2009/03/02/a-simple-example-of-a-mysql-stored-procedure-that-uses-a-cursor/

    +0

    计时它... !!!我是一个F88king白痴俯视它...... –

    +1

    'prop_id = myid'使用用户变量不是prop_id从选择...放在rental_periods.prop_id中,它按预期工作...... !!!! –

    +0

    在我看来,这必须张贴在你的答案中,并接受答案(就像你正在计划)。因为这是有经验的MySQL开发人员只能*发现的东西。为了他们的利益,让我们认为他们不在身边。 :) –