0

mysql に次の構文のストアド プロシージャがあります。

    insert into tbl1 (p1, p2) values (p2, p3);
    set inserted_id = last_insert_id();
    insert into tbl2 (id, image) values (inserted_id, 'list_of_image');

今、この挿入用にこの画像リスト(固定数を持たない)をどのように分離できるかわかりません。何か案が?

4

1 に答える 1

1

それがカンマ区切りの値を含む文字列であると仮定すると'list_of_image'、純粋なSQLで次のことができます

DELIMITER $$
CREATE PROCEDURE sp_insert_images(IN p3 VARCHAR(64), IN p4 VARCHAR(64), IN images VARCHAR(512))
BEGIN
  INSERT INTO Table1 (p1, p2)
  VALUES (p3, p4);

  INSERT INTO Table2 (id, image)
  SELECT LAST_INSERT_ID(), SUBSTRING_INDEX(SUBSTRING_INDEX(i.images, ',', n.n), ',', -1) image
    FROM 
  (
    SELECT images images
  ) i CROSS JOIN 
  (
     SELECT a.N + b.N * 10 + 1 n
       FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
     ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
      ORDER BY n
  ) n
   WHERE n.n <= 1 + (LENGTH(i.images) - LENGTH(REPLACE(i.images, ',', '')));
END$$
DELIMITER ;

SPに電話する

CALL sp_insert_images('Some value1', 'Some value2', 'image1, image2, image3');

これがSQLFiddle のデモです。

ノート:

  1. サンプル クエリは、最大 100 個のカンマ区切りの値に分割されます。多かれ少なかれ必要な場合は、内側のサブクエリを編集して制限を調整できます。
  2. n永続的な集計 (数値) テーブルを作成し、その場で一連の数値を生成する内部選択 (エイリアスを使用) の代わりに使用することを検討してください。
于 2013-07-15T02:03:09.820 に答える