2009-11-21 6 views
25

私の問題はかなり簡単です。私はsets_productsテーブルを使用してproductsテーブルを使用してM:Nを接続しているテーブルsetsを格納するテーブルを持っています。各製品は、パラメータ(M:Nに再度接続)を持つことができます。手順のためのMySQL foreachの代替手段

私はすべてのパラメータを文字列(検索キャッシュ用には '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; 
+0

ああ、私は忘れてしまいました質問自体 - *これはMySQLでできますか?* –

答えて

28

ここ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 
+0

素敵です。私の使い方の簡単な例を書いてください。 –

+0

ありがとうございました。私はこれを試してみます... –

+0

CALL procedure_nameを使用し、使用されるすべてのパラメータをDECLAREする必要がありましたが、うまくいきました。どうもありがとう。 –

8

それは非常に直感的ですが、これは、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

+1

あなたのリンクの直感的でよく書かれたガイド! – Sablefoste

+0

私はそれは古い答えだが、まだ(私のような)人々はそれを探している。 PDFはもはや利用できませんが、ここで私は素敵な説明を見つけました:http://www.mysqltutorial.org/mysql-cursor/ – ElChupacabra

関連する問題