質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

Q&A

1回答

1479閲覧

分岐を伴うMYSQL(PDO)の考え方

SugiuraY

総合スコア317

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

0グッド

0クリップ

投稿2016/09/18 11:14

いつもお世話になります。
(現状)
①下記のDBにあるような値が、すでにデータベースに格納されております。
②また、毎月下記のDataにあるような値をデータベースに追加でinsert into
していく作業を想定しております。

(問題点)

  1. Dataはどうしても、DBにすでに格納されてしまっている情報を持ってきてしまう(例えば[2])ため、これは既にDBが持つ情報もDataには含まれる。
  2. 毎月追加するDateとして格納する値(配列の要素)はDBにカラムにある<period>の情報を持っておりません。

(質問)
ア) 上記の1)の問題点に記載の通り、insert intoしたいdataは下記の例で行けば[3][5][8]の三つだけになります。通常、このようなケースを処理をする場合既存のDBからselectしてfetachしてすべての情報を抜き出し、例えば<name>&<period>のように結合させ(nameとperiodで初めて一意になるため)、dataの各配列を条件分岐させてinsert into するかしないかの処理をするのでしょうか?それともinsert intoのwhere句等をうまく利用して、条件にあうものだけ格納するようなやり方が一般的なのでしょうか。
まだ、初心者でどのような方法がDB処理等の負担もなくスマートなのかがイメージがわかないため、ご質問させていただいました。

イ) また、ア)の結果、必要な配列だけがDBにinsert intoできたものと仮定して、2)の問題が生じます。dataの配列の要素にはperiodに関するが含まれておりません。例えばdataの[3]
A company, 201612, 200にperiodに<id> 1,2の<period>につぐ3番を割り当てたなくてはなりません。なんとなくですが、selectのwhere句で <name>をAcompanyかつ<peiord>が最も大きい物という条件で指定し、2を取得し、これに+1を加えた数値を入れてあげるようなイメージなのですが、いかがでしょうか?
もっと一般的またはスマートな方法があればご指摘を頂ければ幸いです。

また、全体のイメージを構築している段階で文字での質問ばかりとなってしまい、申し訳ございませんが、至らぬ点があればすぐに加筆させいただきます。

何卒、よろしくお願い申し上げます。

-DB- <id> <name> <period> <periodend> <sales> 1 A company 1 201412 100 2 A company 2 201512 200 3 B company 1 201605 10 4 C company 1 201503 1000 5 C company 2 201603 2000 6 C company 3 201503 1500 7 C company 4 201603 1800
-Data- [1]=> array(A company, 201412, 100) [2]=> array(A company, 201512, 200) [3]=> array(A company, 201612, 200) //new! [4]=> array(B company, 201605, 10) [5]=> array(B company, 201611, 5) //new! [6]=> array(C company, 201503, 1500) [7]=> array(C company, 201603, 1800) [8]=> array(C company, 201703, 2000) // new! [9]=> array(D company, 201701, 5000) //new arrival!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

基本的な処理の流れとしては、イメージされている内容であっていると思います。
いくつか条件によっては、改善する余地はあると思います。

  • 毎回Dataにすべてのデータが含まれるなら、毎回全部削除したあと、全部insertしてしまう。

既存のデータとwhereで比較する手間が省けるので、処理的には早くなるかと
この場合、periodはプログラム側でinsert毎に+1していけばいいでしょう

  • <name><period>でユニークとありますが、<name><periodend>でもユニークならば、REPLACE文を使う。

この場合、periodは後から別SQL一回で設定できると思います。

投稿2016/09/20 20:31

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/09/21 03:09

ご回答いただき、まことに有難うございます。 すみません、2点目についてですが、私の記載誤りで、おっしゃるとおり<name>と<periodend>でユニークを意図しております。 >>この場合、periodは後から別SQL一回で設定 のご説明が、あまりイメージがわかなかったのですが、具体的にどのような意味合いでのご教示いただいたものでしょうか?
popobot

2016/09/21 04:50

>>この場合、periodは後から別SQL一回で設定 よくランキングを付けるときに使うSQLを応用すればできます。 http://qiita.com/hmuronaka/items/1afc132ddf400363efc2 <name>が同じもので、自分の<periodend>より古い<periodend>のレコードが何個あるか数えるて1足すと<period>になります。 ※ただし、データ件数が多いと難しいですね。今回の場合<name>ごとのランキングなので、参考サイトの速い版は使えない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問