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

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

ただいまの
回答率

90.76%

  • PHP

    19249questions

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

  • MySQL

    5534questions

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

  • SQL

    2236questions

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

  • JOIN

    19questions

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

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

解決済

回答 2

投稿 編集

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

space_sss

score 61

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

id 名前 項目1 項目2
01 鈴木 1 3
02 山田 2 1
03 田中 1 2
03 佐藤 3 2

動物

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • asahina1979

    2018/01/21 21:44

    それであなたはどうしてみたの?

    キャンセル

  • Kosuke_Shibuya

    2018/01/21 21:48

    正規化を勉強してね。

    キャンセル

  • space_sss

    2018/01/21 21: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 21:54

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

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 22:01

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

    キャンセル

  • 2018/01/21 22:12

    少し疑問だったので質問させていただきます。
    もしお答えいただければ幸いです。
    項目1と項目2といったところですが正しくは

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

    ではないのでしょうか?
    それともそちらの方に何かメリットがあるのでしょうか?
    初歩的名質問で歯異変申し訳ありませんは宜しくお願いいたします。

    キャンセル

  • 2018/01/21 22:18 編集

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

    キャンセル

  • 2018/01/21 22:23

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

    キャンセル

0

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

create table main(id int,name varchar(10),data1 int,data2 int);
insert into main values(1,'鈴木',1,3),(2,'山田',2,1),(3,'田中',1,2),(4,'佐藤',3,2);

create table animal(id int unique,name varchar(10));
insert into animal values(1,'ウサギ'),(2,'カメ'),(3,'イヌ');

select t1.name
,group_concat(if(t1.data1=t2.id,t2.name,null)) as animal1
,group_concat(if(t1.data2=t2.id,t2.name,null)) as animal1
 from main as t1
left join animal as t2 on t2.id in (t1.data1,t1.data2)
group by t1.name,t1.id
order by t1.id

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/25 07:51

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

    キャンセル

  • 2018/01/25 08:11

    あー性能計算(EXPLAIN)を実行しないでだと以下ぐらいしか思い浮かばないが

    メリット:項目が増えてもJOIN数が増えない
    デメリット:移植性が低い(MySQL専用、たぶんMAXを利用で解決できる)
    デメリット:グループ関数を使用している

    あとなんだろう(性能計測して比較してよければ最大のメリットになるけどね)

    キャンセル

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

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

関連した質問

  • 解決済

    mysql where句 複数テーブルで複数条件の摘出

    お世話になります。  mysqlを二日前から勉強し始めた超初心者です。  まったくの初心者なのですが、自力での解決が難しそうなので、教えて下さい。  <現状の問題点>

  • 解決済

    重複したデータを抽出させないSQL

    同一テーブル、または別テーブルに重複したデータが存在していれば、 それを抽出するCSVリストを作成したいと考えております。 ID SEI MEI 010 山田 太郎 02

  • 解決済

    MySQLのカラムに収めるデータ形式について

    お世話になります。 勉強しながらPHPとMySQLの連携で小規模なウェブサイトを作ったりしている身ですが、新しくアプリを設計するとき、表題にある「カラムに収めるデータの形式」につい

  • 解決済

    SQL内で抽出後のデータを修正する方法

    下記のSQL文に対して、WHERE句の抽出条件によって、 Cの値が重複していれば、一行にしてCの値をNULLに変えたいです。 どの様に書き直せばいいでしょうか? ご教授いただければ

  • 解決済

    Aceessで1つのテーブルから複数JOINしたい

     前提 初めて質問させていただきます。AccessでSQLを初めて触っているものです。よって、ところどころ言葉の使い方がおかしい部分があるかもしれません。その部分含めご指摘いただけ

  • 解決済

    SQLの結合について

    テーブルA |A1|A2| |1 |3| |2||4| テーブルB |B1||B2| |1||2| |3||NULL| 1.SQL SELECT A1,A2,B1,B2  FRO

  • 解決済

    GROUP BYで絞った結果をさらに絞る方法

    年月ごとの総数を求めたかったのですが、GROUP BYを利用すると,まとめた総数からさらに条件をつけて絞った条件総数がわからず困っています。 SELECT DATE_FORMA

  • 解決済

    [PostgreSQL][9.6.x]VIEW生成用SQLとVIEWのレコード数が相違する

     現象 あるテーブルAに複数のテーブル(B,C,D)をleft joinしてviewを作っているのですが、 view生成用SQLを実行すると結果として4レコード返ってくる(想定通り

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

  • PHP

    19249questions

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

  • MySQL

    5534questions

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

  • SQL

    2236questions

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

  • JOIN

    19questions

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