見出し画像

MMORTBS開発記-011 mysqlはunpivotないんだって

いつもありがとうございます。

スキマ時間開発のお時間です。よろしくお願いします。

前回までのあらすじ

  ユニット明細の画面できた。


今回はデータを作るよーってことで。

前回の

画像1

この部分をやっつけます。


ユニットは縦にデータ持っていて、マスタはさすがに管理面倒なので横持ち。

データコピーの際には、ひと手間が必要です。

そしてmysqlにはunpivotはございません。(へー。初めて知った)


なのでunpivotのSQLを発明する必要があります。

まぁそんなに長くないけど。


   -- マスタから取得して登録する項目(属性)
   INSERT INTO trn_memdtl SELECT 
      dtl1.user_id
    , dtl1.member_id
    , crs.memdtl_cd
    , NULL
    , CASE crs.memdtl_cd
       WHEN 'attribute_01' THEN sp1.attribute1
       WHEN 'attribute_02' THEN sp1.attribute2
       WHEN 'attribute_03' THEN sp1.attribute3
       WHEN 'attribute_04' THEN sp1.attribute4
       WHEN 'attribute_05' THEN CASE WHEN dtl3.str_val IS NULL THEN sp1.attribute5 ELSE sp3.attribute1 END
       WHEN 'attribute_06' THEN CASE WHEN dtl3.str_val IS NULL THEN sp1.attribute6 ELSE sp3.attribute2 END
       WHEN 'attribute_07' THEN CASE WHEN dtl2.str_val IS NULL THEN sp1.attribute7 ELSE sp2.attribute1 END
       WHEN 'attribute_08' THEN CASE WHEN dtl2.str_val IS NULL THEN sp1.attribute8 ELSE sp2.attribute2 END
       WHEN 'attribute_09' THEN CASE WHEN dtl2.str_val IS NULL THEN sp1.attribute9 ELSE sp2.attribute3 END
       WHEN 'attribute_10' THEN CASE WHEN dtl2.str_val IS NULL THEN sp1.attribute10 ELSE sp2.attribute4 END
       WHEN 'attribute_11' THEN CASE WHEN dtl3.str_val IS NOT NULL THEN sp3.attribute3 
         WHEN  dtl2.str_val IS NOT NULL THEN sp2.attribute5 ELSE sp1.attribute11  END
       WHEN 'attribute_12' THEN CASE WHEN dtl3.str_val IS NOT NULL THEN sp3.attribute4 
         WHEN  dtl2.str_val IS NOT NULL THEN sp2.attribute6 ELSE sp1.attribute12  END
       WHEN 'attribute_13' THEN sp1.attribute13
      END 
    , NOW(), NOW(), 'prc_decision_gacha', 'prc_decision_gacha'
   FROM trn_memdtl dtl1
    LEFT JOIN trn_memdtl dtl2
     ON dtl1.user_id = dtl2.user_id
     AND dtl1.member_id = dtl2.member_id
     AND dtl2.memdtl_cd = 'breed_02'
    LEFT JOIN trn_memdtl dtl3
     ON dtl1.user_id = dtl3.user_id
     AND dtl1.member_id = dtl3.member_id
     AND dtl3.memdtl_cd = 'breed_03'
    LEFT JOIN mst_species sp1
     ON  dtl1.str_val = sp1.species_cd
    LEFT JOIN mst_species sp2
     ON  dtl2.str_val = sp2.species_cd
    LEFT JOIN mst_species sp3
     ON  dtl3.str_val = sp3.species_cd
    CROSS JOIN
     ( SELECT 'attribute_01' AS memdtl_cd
       UNION ALL SELECT 'attribute_02' AS memdtl_cd
       UNION ALL SELECT 'attribute_03' AS memdtl_cd
       UNION ALL SELECT 'attribute_04' AS memdtl_cd
       UNION ALL SELECT 'attribute_05' AS memdtl_cd
       UNION ALL SELECT 'attribute_06' AS memdtl_cd
       UNION ALL SELECT 'attribute_07' AS memdtl_cd
       UNION ALL SELECT 'attribute_08' AS memdtl_cd
       UNION ALL SELECT 'attribute_09' AS memdtl_cd
       UNION ALL SELECT 'attribute_10' AS memdtl_cd
       UNION ALL SELECT 'attribute_11' AS memdtl_cd
       UNION ALL SELECT 'attribute_12' AS memdtl_cd
       UNION ALL SELECT 'attribute_13' AS memdtl_cd
     ) crs
    WHERE dtl1.memdtl_cd = 'breed_01'
     AND dtl1.user_id = x_user_id
     AND dtl1.member_id = p_member_id;
     

マスタの数も少ないので、汎用処理にする必要はない。。。はず。

ウォーターフォール開発ではない弊害が今ここに!

何個か出てきたら考える。



最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?