Подтвердить что ты не робот

MySQL foreach альтернатива для процедуры

Моя проблема довольно проста. У меня есть таблица 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;
4b9b3361

Ответ 1

Здесь ссылка mysql для курсоров. Поэтому я предполагаю, что это примерно так:

  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

Это можно сделать с 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