🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1281閲覧

PHP連想配列をSQLの「AS ~」に用いたい

mokeame

総合スコア0

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/12/31 14:23

編集2020/12/31 15:33

前提・実現したいこと

PHPで連想配列を define して、SQLのマスタテーブルの役割として用いています。

この連想配列をもとに、SQLで select する際に変換したいです。

該当のソースコード

マスタテーブルは次のものです。
投稿タイプとして「ニュース」や「ブログ」があるという意味になります。

php

1define( 'master_types', [ 1=>'news', 2=>'blog' ] );

投稿テーブルは次のものです。

sql

1CREATE TABLE posts 2 (`ID` int, `type_id` int, `title` varchar(100), `author_id` int) 3; 4INSERT INTO posts 5 (`ID`, `type_id`, `title`, `author_id`) 6VALUES 7 (1, 2, 'ブログ1つ目', 9), 8 (2, 1, 'ニュース1つ目', 4), 9 (3, 2, 'ブログ2つ目', 2) 10; 11

そして上記投稿テーブルからPHPで select するとこう書きます。

php

1$query = " 2select 3ID 4,type_id AS type_name 5 6from 7posts;";

やりたいのは、「AS type_name」とあるように、「type_id」を「type_name」に変換することです。

つまり次の取得が目的です。

IDtype_name
1blog
2news
3blog

現状

現状はSQLの変換がわからないので、

IDtype_id
12
21
32

という風にtype_idのままで取得し、その後にPHPでtype_nameへと変換している状況です。

試したこと

今回はSQL側で変換したいので以下 case when になるのかと思ったのですが、

php

1$query = " 2select 3ID 4,case when type_id=1 then 'news' when type_id=2 then 'blog' end as type_name 5 6from 7posts;";

しかし、define しているものをわざわざ then 'news' とか then 'blog' のように書かないといけません。

つまり define を変更した際に、define だけでなく、この $query をも変更しなければならず、define のメリットが活かしきれない点に不満を覚えました。

そこで何かいい方法がありそうに思って質問させて頂いた次第です。
宜しくお願い致します。

###環境
PHP 7.3
MySQL 5.5

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/31 15:29

mysqlなのか別なのか明らかにした方が回答が付きやすいし、データベースシステムにちなんだ質問タグをつけると回答が付きやすいよ。
mokeame

2020/12/31 15:34

すみません、ありがとうございます。タグや環境を追加致しました。
takasima20

2020/12/31 21:07

type_name のマスターテーブルを作ればいいんじゃね?
guest

回答1

0

define を変更した際に、define だけでなく、この $query をも変更しなければならず、define のメリットが活かしきれない点に不満を覚えました。

PHPでもSQLでも同一の定義を参照可能なように設計していないのですから当然です。
対応するなら、先ずはdefineをSQLで参照できる形(テーブル化とかストアド化とか)に置き換えて下さい。

投稿2021/01/01 04:09

sazi

総合スコア25327

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

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

mokeame

2021/01/01 18:46

テーブル化というのは、postsが1億件あったら、1億件のjoinが発生しますよね?それってどうなのでしょうか?普通なんですか?なんとなく遅くなりそうなのでdefineしたのですが、テーブル化の方がいいでしょうか? ストアド化というのはわからないので、よかったら具体的に教えてくださいませんでしょうか。
sazi

2021/01/01 20:10 編集

テーブルの内容を取得して、グローバル変数にするとかクラスにするなどで、joinする必要は無いですね。 尤も、defineの件数がそんなに多く無ければjoinしても大差は無いと思いますが。 ストアド化というのは、テーブルではなく同等の結果(定数の一覧)を返却するストアドにするという事です。viewでも良いかもしれません。 > なんとなく遅くなりそうなのでdefineした 明確な根拠を持った設計を心掛けて下さい。
mokeame

2021/01/02 12:22

ありがとうございます。ストアド調べましたが使い方がむずめですね…
退会済みユーザー

退会済みユーザー

2021/01/02 12:51

enum が候補から外されてるのは意図的?
mokeame

2021/01/02 14:57

偉い方ばかりですね。
sazi

2021/01/02 16:32

@te2jiさん ENUMは値をインデックスに変換するのが本来の用途なので、後付けで採用するにはあまり適していないと思います。
退会済みユーザー

退会済みユーザー

2021/01/02 22:08

継続的な更新を考慮したってことですね。 理解できました。ありがとう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問