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

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

詳細はこちら
MySQL

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

PHP

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

Q&A

解決済

4回答

1415閲覧

複数のテーブルに渡る検索を行いたい

wafflek

総合スコア15

MySQL

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

PHP

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

0グッド

2クリップ

投稿2019/10/21 03:37

編集2019/10/21 04:12

PHPを使った検索フォームから入力された値を使ってMySQLでデータベースからデータを取ってくるということをしたいのですが、少し複雑なところがあり、また未熟者でもあるのでお力を貸していただければと思い質問させていただきます。
データベース(以下DB)のテーブルが5つあり、テーブルの名前がA、B-1、B-2、B-3、B-4とします。
AのDBの一つのカラムにtable_typeとして1,2,3,4の数字が入り、1がB-1、2がB-2、3がB-3、4がB-4に対応しています。
また別のカラムにtitle_idとしてBのいずれかのテーブルの中のidが入っています。
Bのテーブルにはカラムとしてint型のidとtext型のタイトルがあります。
例えば
Aのtable_typeが2でtitle_idが23のとき、B-2のidが23のところに対応しています。そこからタイトルを知ることができます。
今回やりたいことはまず入力された値を4つのBのテーブルのタイトルの中から部分一致で当てはまる箇所を探してきてそこからAのtable_typeとtitle_idを取ってくるという動作をしたいです。

入力された値が「ああ」の場合
もしB-2のidが3の箇所のタイトルのところに「ああいいうう」というデータが入っていたならテーブルAのtable_typeが2でtitle_idが3である部分の行を取り出したいとします。

MySQL

1create table A (id int, table_type tiny_int(4), title_id int); 2create table B-1 (id int, title varchar(10)); 3create table B-2 (id int, title varchar(10)); 4create table B-3 (id int, title varchar(10)); 5create table B-4 (id int, title varchar(10)); 6 7INSERT INTO A(id,table_type,title_id)VALUES(1,1,3); 8INSERT INTO A(id,table_type,title_id)VALUES(2,4,4); 9INSERT INTO A(id,table_type,title_id)VALUES(3,2,3); 10INSERT INTO A(id,table_type,title_id)VALUES(4,3,1); 11 12INSERT INTO B-1(id,table_type,title_id)VALUES(1,'ttt'); 13INSERT INTO B-1(id,table_type,title_id)VALUES(2,'aaa'); 14INSERT INTO B-1(id,table_type,title_id)VALUES(3,'yyy'); 15 16INSERT INTO B-2(id,table_type,title_id)VALUES(1,'あかさたな'); 17INSERT INTO B-2(id,table_type,title_id)VALUES(2,'あいうえお'); 18INSERT INTO B-2(id,table_type,title_id)VALUES(3,'ああいいうう'); 19 20INSERT INTO B-3(id,table_type,title_id)VALUES(1,'111'); 21INSERT INTO B-3(id,table_type,title_id)VALUES(2,'222'); 22INSERT INTO B-3(id,table_type,title_id)VALUES(3,'333'); 23 24INSERT INTO B-4(id,table_type,title_id)VALUES(1,'ppp'); 25INSERT INTO B-4(id,table_type,title_id)VALUES(2,'qqq'); 26INSERT INTO B-4(id,table_type,title_id)VALUES(3,'rrr'); 27 28

またテーブルAに入っているデータがテーブルBに入っていないということはありません。
この場合どのようにすればよいでしょうか?
また至らぬところがありましたらご指摘お願いします。

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

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

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

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

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

Orlofsky

2019/10/21 06:56

>Aのtable_typeが2でtitle_idが23のとき、B-2のidが23のところに対応しています。 初歩的なことですが、説明文に載っているサンプルデータを提示しましょう。 SQL では - ハイフンはマイナスの意味で使うので、通常テーブル名や列名には使いません。バックスラッシュでテーブル名や列名を囲めば使えたかもですが、良識がある経験者が入る度にどうしてこんな変なネーミングにしたの?って質問され続けられます。 テーブル定義に PRIMARY KEYやINDEXを追加してください。
guest

回答4

0

Aのtable_typeの値で連結するテーブルが違うということですか?
それはやめたほうがよいでしょう
B1~B4をひとつのテーブルBにして1~4の情報をカラムでもてば解決します

どうしても運用方法が変えられないなら、プロシージャで場合分けするのが妥当でしょう

投稿2019/10/21 03:43

編集2019/10/21 03:44
yambejp

総合スコア116694

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

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

yambejp

2019/10/21 03:45

状況がわからないので、どうしてもというなら 具体的なテーブルのサンプルをつけてください
guest

0

ベストアンサー

SQL

1 2create table A (id int, table_type tinyint(4), title_id int); 3create table B_1 (id int, title varchar(10)); 4create table B_2 (id int, title varchar(10)); 5create table B_3 (id int, title varchar(10)); 6create table B_4 (id int, title varchar(10)); 7 8INSERT INTO A(id,table_type,title_id)VALUES(1,1,3); 9INSERT INTO A(id,table_type,title_id)VALUES(2,4,4); 10INSERT INTO A(id,table_type,title_id)VALUES(3,2,3); 11INSERT INTO A(id,table_type,title_id)VALUES(4,3,1); 12 13INSERT INTO B_1 VALUES(1,"ttt"); 14INSERT INTO B_1 VALUES(2,"aaa"); 15INSERT INTO B_1 VALUES(3,"yyy"); 16 17INSERT INTO B_2 VALUES(1,"あかさたな"); 18INSERT INTO B_2 VALUES(2,"あいうえお"); 19INSERT INTO B_2 VALUES(3,"ああいいうう"); 20 21INSERT INTO B_3 VALUES(1,"111"); 22INSERT INTO B_3 VALUES(2,"222"); 23INSERT INTO B_3 VALUES(3,"333"); 24 25INSERT INTO B_4 VALUES(1,"ppp"); 26INSERT INTO B_4 VALUES(2,"qqq"); 27INSERT INTO B_4 VALUES(3,"rrr");

SQL

1SELECT A.* 2 , ifnull( B_1.title, ifnull( B_2.title, ifnull( B_3.title, ifnull( B_4.title, '' ) ) ) ) as title 3FROM A 4 LEFT JOIN B_1 ON ( 5 1 = A.table_type 6 AND B_1.id = A.title_id 7 ) 8 LEFT JOIN B_2 ON ( 9 2 = A.table_type 10 AND B_2.id = A.title_id 11 ) 12 LEFT JOIN B_3 ON ( 13 3 = A.table_type 14 AND B_3.id = A.title_id 15 ) 16 LEFT JOIN B_4 ON ( 17 4 = A.table_type 18 AND B_4.id = A.title_id 19 ) 20where ifnull( B_1.title, ifnull( B_2.title, ifnull( B_3.title, ifnull( B_4.title, '' ) ) ) ) like '%ああ%' 21;

B_1~B_4にはそれぞれ中身が1~4に固定されているカラムがあるイメージですね。

投稿2019/10/21 05:21

tomari_perform

総合スコア760

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

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

0

SQL

1SELECT A.table_type, A.title_id 2FROM A 3LEFT JOIN( 4 SELECT 5 1 AS TABLE_TYPE, 6 ID, 7 TITLE 8 FROM 9 B-1 10 UNION ALL 11 SELECT 12 2 AS TABLE_TYPE, 13 ID, 14 TITLE 15 FROM 16 B-2 17 UNION ALL 18 SELECT 19 3 AS TABLE_TYPE, 20 ID, 21 TITLE 22 FROM 23 B-3 24 UNION ALL 25 SELECT 26 4 AS TABLE_TYPE, 27 ID, 28 TITLE 29 FROM 30 B-4 31)B 32ON A.table_type = B.TABLE_TYPE 33AND A.title_id = B.ID 34WHERE B.TITLE LIKE '%あああ%' 35

ちょっと無理矢理感がありますが
BテーブルのIDとTITLE列の型が等しいのが前提です。
Bテーブルをすべて結合してAテーブルとジョインしてから条件で絞りこむイメージです
結合するさいにどのテーブルか識別するためにTABLE_TYPEを追加しています
ただ、このテーブルレイアウトだとAテーブルにTITLEを持てばいいだけな気もします

投稿2019/10/21 04:22

編集2019/10/21 04:46
shirokuma4690

総合スコア154

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

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

0

yambejp さんの書いているように、テーブル設計を見直したほうが良いかと思います。

B1〜4をBテーブルとして、種類をカラムで管理します。
B1〜4でカラム数などが違うとしても、全てのカラムを用意して、1〜4で入力するカラムを変更すれば良いです。

そうすると、以下で取得できると思います。

SQL

1SELECT * FROM A INNER JOIN B ON A.table_type = B.table_type WHERE A.table_type = 1 AND B.title like '%ああ%';

投稿2019/10/21 04:09

m_o

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問