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

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

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

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

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

PHP

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

Q&A

解決済

2回答

2720閲覧

SQLのJOINに関しての質問です。

space_sss

総合スコア81

MySQL

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

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

PHP

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

0グッド

0クリップ

投稿2018/01/21 12:42

編集2018/01/21 12:56

テーブルの結合に関しての質問です
メインテーブル

id名前項目1項目2
01鈴木13
02山田21
03田中12
03佐藤32

動物

id項目
01ウサギ
02カメ
03イヌ

こういった2つのテーブルがあったとします。
これのテーブルを結合し

id名前項目1項目2
01鈴木ウサギイヌ
02山田カメウサギ
03田中ウサギカメ
04佐藤イヌカメ

こういった形にしたいのですが

その際のSQL文はどのようになるのでしょうか?

できればメインテーブルのidは特に表示には使用しないため*にも指定し
最終的の結果表示は

名前項目項目
鈴木ウサギイヌ
山田カメウサギ
田中ウサギカメ
佐藤イヌカメ

といったものを表示したいのですがこれは可能なのでしょうか?
宜しくお願いいたします。

追記文
試したものに関しての記載がないと指摘をいただいたのでその点を修正いたします。

SQL

1SELECT * FROM メインテーブル LEFT JOIN 動物 ON 動物.id = メインテーブル.項目1 OR 動物.id = メインテーブル.項目2;

といった形で試したのですが二行になってしまいかといって

SQL

1SELECT 名前,動物.項目, FROM メインテーブル LEFT JOIN 動物 ON 動物.id = メインテーブル.項目1 AND 動物.id = メインテーブル.項目2;

ですとNULLが返って来てしまい困っています。
OR文で2行を取得しSELECTの指定でどうにかするのかなと思い色々試しているのですがうまくいきません。

初歩的なことかもしれませんがどうぞ宜しくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/01/21 12:44

それであなたはどうしてみたの?
退会済みユーザー

退会済みユーザー

2018/01/21 12:48

正規化を勉強してね。
space_sss

2018/01/21 12:53

SELECT * FROM メインテーブル LEFT JOIN 動物 ON 動物.id = メインテーブル.項目1 OR 動物.id = メインテーブル.項目2;といった形で試したのですが二行になってしまいかといってSELECT 名前,動物.項目, FROM メインテーブル LEFT JOIN 動物 ON 動物.id = メインテーブル.項目1 AND 動物.id = メインテーブル.項目2;ですともちろんNULLが返って来てしまい困っています。ただORで2行表示しSELECTの指定でなんとかするのかなぁ。。。といったところで生きずまっております。試した方法を記載していなかった点に関しては大変申し訳ありません。。。
Orlofsky

2018/01/21 12:54

質問にCREATE TABLEやCREATE INDEXを載せましょう。正規化をきちんと勉強していただくとして、メインテーブルに項目1, 項目2がある現状に項目3, 項目4,,, と追加されたらどうします?
guest

回答2

0

ベストアンサー

できるかできないかで言えば可能です。

※ 誤った回答をあげてないので実装方法はあまりよくない方法で

SELECT メイン.名前, MAX(SELECT IF(動物.ID = メイン.項目1,動物.項目, NULL) FROM 動物 ) AS 項目1, MAX(SELECT IF(動物.ID = メイン.項目2,動物.項目, NULL) FROM 動物 ) AS 項目2 FROM メイン GROUP BY メイン.名前

で MYSQLだと行けると思います。w

commentですがでたので

SELECT メインテーブル.名前, 動物1.項目, 動物2.項目 FROM メインテーブル LEFT JOIN 動物 動物1 ON 動物1.id = メインテーブル.項目1 LEFT JOIN 動物 動物2 ON 動物2.id = メインテーブル.項目2

のようになります。

横に項目が続くのであればその行数分必要になります。

投稿2018/01/21 12:50

編集2018/01/21 12:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

space_sss

2018/01/21 13:01

迅速な回答ありがとうございます。 こういった場合はLEFT JOINを増やして対応するのですね! ANDやORで対応するのかと思い詰まっていました。 早速試してみます! お時間頂ありがとうございました!
space_sss

2018/01/21 13:12

少し疑問だったので質問させていただきます。 もしお答えいただければ幸いです。 項目1と項目2といったところですが正しくは SELECT メインテーブル.名前, 動物1.項目, 動物2.項目 FROM メインテーブル LEFT JOIN 動物 動物1 ON 動物1.id = メインテーブル.項目 LEFT JOIN 動物 動物2 ON 動物2.id = メインテーブル.項目 ではないのでしょうか? それともそちらの方に何かメリットがあるのでしょうか? 初歩的名質問で歯異変申し訳ありませんは宜しくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/01/21 13:19 編集

同一のテーブルに同一の項目名は設定できませんよ。
space_sss

2018/01/21 13:23

あ、大変失礼しました。完全にコチラのかんちがいでした。 問題なく解決いたしました!ありがとうございます!
guest

0

同じデータをleft joinしたくない場合はこんな感じでしょうか

SQL

1create table main(id int,name varchar(10),data1 int,data2 int); 2insert into main values(1,'鈴木',1,3),(2,'山田',2,1),(3,'田中',1,2),(4,'佐藤',3,2); 3 4create table animal(id int unique,name varchar(10)); 5insert into animal values(1,'ウサギ'),(2,'カメ'),(3,'イヌ'); 6 7select t1.name 8,group_concat(if(t1.data1=t2.id,t2.name,null)) as animal1 9,group_concat(if(t1.data2=t2.id,t2.name,null)) as animal1 10 from main as t1 11left join animal as t2 on t2.id in (t1.data1,t1.data2) 12group by t1.name,t1.id 13order by t1.id

投稿2018/01/22 01:27

yambejp

総合スコア114581

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

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

space_sss

2018/01/24 22:51

ご連絡が遅れて申し訳ありません。 現状あがっている回答との違いに関してなんですがどういったメリットデメリットあるいは使い分けとなってくるのでしょうか? 上記のものが全くの想像外でしたのでよろしければ御回答いただけると幸いです。
退会済みユーザー

退会済みユーザー

2018/01/24 23:11

あー性能計算(EXPLAIN)を実行しないでだと以下ぐらいしか思い浮かばないが メリット:項目が増えてもJOIN数が増えない デメリット:移植性が低い(MySQL専用、たぶんMAXを利用で解決できる) デメリット:グループ関数を使用している あとなんだろう(性能計測して比較してよければ最大のメリットになるけどね)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問