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

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

ただいまの
回答率

88.77%

配列関数が使用可能なデータベースについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 348

heysister721

score 53

データベースを使い始めて間もないのですが、こちらへ以前投稿した内容の続きみたいなことになります。

MySQLを使って配列を結合するようなことを試みています。
現在では、MySQLの「ビュー設定」を下記の通りにコーディングし、CSVでの出力結果から「テキストエディタ」で囲い文字を削除して強制的に結合しています。

CREATE VIEW view_process_plan AS
SELECT
    saler_name,
    LPAD( customer_code , 5 ,'0'),
    customer_name,
    product_num,
    direction_num,
    branch_num,
    parts_num,
    parts_name,
    product_quantity,
    DATE_FORMAT( desired_date , '%m/%d' ),
    DATE_FORMAT( answer_date, '%m/%d' ),
    DATE_FORMAT( work_date, '%m/%d' ),
    unit_price,
    amount_money,
    GROUP_CONCAT(process_code separator ',')
FROM
    process_plan
GROUP BY
  desired_date,
    product_num,
    branch_num
ORDER BY
    customer_code


上記コードの”GROUP_CONCAT(process_code separator ',')”をMySQLで行っています。

このビューを実行すると、"1111","2222","3333","AAA,BBB,CCC"みたいに出力されるため、これをCSVで出力してメモ帳で開き、囲み文字(”)を全文置換(削除)して「1111,2222,3333,AAA,BBB,CCC」となるよう変換して利用しています。

これをできることなら「配列関数が使用可能なデータベースに置換え、メモ帳などの別ツールを使用しなくても結合状態で出力する」ことができないものかと思案しています。

以前質問させていただきました際には「PostgreSQL」では配列関数があるような話もすこし出ていたようなので、配列を自在に追加することが可能なデータベースがありましたら、教えていただけますでしょうか。

最終的には、PHPを使って「CSVをデータベースに登録し、ビュー結果をCSVで出力したい」と考えています。

可能であれば、上記コードで再現できるようコードを教えていただければ嬉しいのですが、そこは”甘え”と思われる場合は無視して頂いて構いません。よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/08/21 11:59 編集

    今回「PHP」「TomCat」は不要ではないでしょうか。
    「データベース」のタグは必要に思います。
    また下記は意味が分かりません。
    >メモ帳などの別ツールを使用
    急に出てきた「メモ帳」はどういう意図があるのでしょうか

    キャンセル

  • heysister721

    2019/08/21 12:16

    概ね修正・追記いたしました。

    キャンセル

  • m.ts10806

    2019/08/21 13:17

    PHPは最終的なもので本件に直接関係ある内容ではないのでなくてもいいかなと。
    細かいところなのでお任せしますが「適切なタグをつける」のを心がけるようにしてもらったらと。
    https://teratail.com/help/question-tips#questionTips3-2

    キャンセル

回答 2

checkベストアンサー

+1

> データベースを使い始めて間もない

のであれば GROUP_CONCATへの理解も浅いのでしょうね
実際、カラムにふくまれるデータをあたかも配列のように処理するにはいくつか方法があります

  • テキスト系のカラムにカンマ区切りで保持してFIND_IN_SETで検索
  • JSON型のカラム利用
  • 全文検索

ただし、上記は結果としてはバラバラにデータをもってGROUP_CONCATすることと
同じ様な機能に見えますが、効率的なデータの持ち方ではなくオルタナティブな処理にはなりません。
正規化をきちんと学習して、GROUP_CONCATを選択するのが最適な場合があることを
理解してください

追記

1点気になったのですが

"1111","2222","3333","AAA,BBB,CCC"みたいに出力される

とありますが、GROUP_CONCAT(process_code separator ',')としても、
エンクロージャが勝手に付加されることはないと思います。
元データのそれぞれが「"」で囲まれているようなことはありませんか?

create table tbl(id int,val varchar(10));
insert into tbl values
(1,'"1111"'),
(1,'"2222"'),
(1,'"3333"'),
(1,'"AAAA,BBBB,CCCC"'),
(2,'"XXXX"');
select id,group_concat(val) as vals from tbl group by id;


対応策

select id,group_concat(replace(val,'"','')) as vals from tbl group by id;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/21 13:01

    貴殿のご指摘内容が理解できず申し訳ございません。当方環境においては、投稿したコードで動作しているので、問題ないかと思っています。phpMyadminで実行結果を確認しても、GROUP_CONCAT(process_code separator ',')の結果はカンマ区切りで出力されています。
    もしこれが「正規表現ではないから」ということであればなんとかします。

    キャンセル

  • 2019/08/21 13:12

    ごめんなさい、理解いただいていないようですね
    process_codeにダブルクォーテーション付きのデータが保持されているはずということです
    仮にそうであってもreplaceすればいけませんか?という回答ですが
    私のサンプルでなにか試していただきましたか?

    キャンセル

+1

配列を自在に追加することが可能なデータベースがありましたら、教えていただけますでしょうか。

配列を扱う事に主眼を置くなら、postgresでしょうね。
MySQLではなくMariaDBをお使いなら、MySQLでしか使えない分析関数なども使用できますので、それ以外のもメリットはあります。

ただ、あくまで利用する目的に対して大きなデメリットが無いならという前提です。

MySQLのままであれば、Json型を利用したり、Viewの代わりにストアドプロシージャにしてその内部で配列処理を行うなどの方法も考えられます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る