普通のショップでは使わないと思うのですが、
MySQLでのファンクションをどのように使えばいいか?
についての話。
MySQLのfunctionとはなになのか?について
こういえば一発で判ると思います。
functionとは、Rubyならdef Perlならsub MySQLならfunctionです。
ただ、ほとんど普段は使う必要がありません。
今回、functionで何を行ったか
EC-Cube2の高度な管理から出力するCSV出力を使ったCSV作成処理で、
11111の商品を買った時と22222の商品を買った時で、【選択Aがある】と【選択Aがある】【選択Bがある】と【選択Bがある】の3値をとる可能性が出てきたため、今後選択CやDが増える可能性がある状態を考慮しつつ、これを [商品選択状況]というカラム1個にまとめる処理をSQLとfunctionで実現
なぜこの対応が必要だったかという背景
EC-Cube2からデータをCSVで配送会社のシステムに送った際、この配送会社のシステムが少し賢いため、order_idを基準に1回の出荷としてまとめてくれています。とても素敵な機能なのですが、出荷指示の項目だけが上書き処理されるため、たとえば3つの商品を購入した際に、2個目の商品と3個目の商品でおまけグッヅが異なる場合には、3個目の商品についてくるオマケだけが記載され、ピッキング処理にわたってしまう問題が起きていました。
この状況を解決するために、EC-Cube2から出力するCSV自体に、同時購入商品に関連する全てのおまけぐっづ情報を記載し、1つの受注idでどのように上書きされても必ず全てのオプションがピッキング指示に入るようになりました。
以下が実現したfunction
order_idを使い、同じorder_idで他の対象AやBの同時購入チェックを行い、文字列で返却するファンクションを作って対応しています。
DROP FUNCTION IF EXISTS checkitem;
DELIMITER //
CREATE FUNCTION checkitem (orderId INT) RETURNS CHAR(50) DETERMINISTIC
BEGIN
DECLARE x TEXT;
DECLARE y TEXT;
/* 初期値を置いておくことにした */
SET x = "";
SET y = "";
/* 選択肢Aが入る条件のテスト */
CASE
WHEN (SELECT product_id FROM dtb_order_detail WHERE order_id = orderId and product_id in (商品ID, 商品ID) limit 1) then
SET x = "【Bあり】";
ELSE BEGIN END;
END CASE;
/* 選択肢Bが入る条件のテスト */
CASE
WHEN (SELECT product_id FROM dtb_order_detail WHERE order_id = orderId and product_id in ( 商品ID, 商品ID) limit 1) then
SET y = "【Aあり】";
ELSE BEGIN END;
END CASE;
RETURN concat(x,y);
END
//
DELIMITER ;
運用方法
新しい特殊対応商品が増えた際は、caseを増やしていくことで、
いくらでも対応できることになります。
レンタルサーバなどではできないことかもしれませんね。
使い道
特殊な配送会社とシステム会社があって必要となる機能なので、普通は使わないと思います。