代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Fejfar

mysql foreach程序替代方案

  •  29
  • TomáÅ¡ Fejfar  · 技术社区  · 15 年前

    我的问题相当简单。我有桌子 sets 存储产品集(更多的产品看起来像一个在外面-计算机,鼠标和键盘为例)它连接m:n使用 sets_products 表到 products 表。每个产品都可以有参数(再次连接m:n)。

    我有一个过程,它以字符串的形式生成所有参数(对于搜索缓存,如'hdd:120gb,lcd:1440:900,…'.),但现在我需要循环访问集合的产品,并为每个产品调用该过程。我不能在PHP中这样做,因为这是在触发器中使用的。

    我想用类似的东西(伪SQL)

    FOREACH(SELECT products_id FROM sets_products WHERE set_id = 1)
        generate_parameter_list(product_id,@result)
        @param = CONCAT(@param,",",@result);
    END FOREACH;
    

    这可以在MySQL中完成吗?

    2 回复  |  直到 6 年前
        1
  •  35
  •   Rory    15 年前

    这里是 mysql reference for cursors . 所以我猜是这样的:

      DECLARE done INT DEFAULT 0;
      DECLARE products_id INT;
      DECLARE result varchar(4000);
      DECLARE cur1 CURSOR FOR SELECT products_id FROM sets_products WHERE set_id = 1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
      OPEN cur1;
    
      REPEAT
        FETCH cur1 INTO products_id;
        IF NOT done THEN
          CALL generate_parameter_list(@product_id, @result);
          SET param = param + "," + result; -- not sure on this syntax
        END IF;
      UNTIL done END REPEAT;
    
      CLOSE cur1;
    
      -- now trim off the trailing , if desired
    
        2
  •  11
  •   BenMorel fullstacklife    10 年前

    这可以通过mysql来实现,尽管它非常不具说服力:

    CREATE PROCEDURE p25 (OUT return_val INT)
    BEGIN
      DECLARE a,b INT;
      DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;
      DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET b = 1;
      OPEN cur_1;
      REPEAT
        FETCH cur_1 INTO a;
        UNTIL b = 1
      END REPEAT;
      CLOSE cur_1;
      SET return_val = a;
    END;//
    

    查看本指南: mysql-storedprocedures.pdf