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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

SQL

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

Q&A

解決済

3回答

1951閲覧

複数カラムの結合(?)

Ogamary

総合スコア17

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

SQL

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

0グッド

0クリップ

投稿2016/07/20 10:27

編集2016/07/20 10:44

テーブルの結合方法で行き詰っています。

下記の2テーブルがあるとして、

◆担当者テーブル

案件名 フェーズ1担当 フェーズ2担当 フェーズ3担当
案件1 1 2 3
案件2 2 1 3
案件3 1 3 2

◆ユーザーテーブル

ID 名前
1 Aさん
2 Bさん
3 Cさん

下記のように表示したいです。

案件名 フェーズ1担当 フェーズ2担当 フェーズ3担当
案件1 Aさん Bさん Cさん
案件2 Bさん Aさん Cさん
案件3 Aさん Cさん Bさん

クエリの書き方で試行錯誤していますが、わかりませんでした。。
ご教授お願い致します。。


追記
試したこと


担当者テーブル t
LEFT JOIN ユーザーテーブル u
t.フェーズ1担当 = u.ID AND t.フェーズ2担当 = u.ID AND t.フェーズ3担当 = u.ID

と書いたところで、SELECTのカラム名に何と書くか迷いました。


SELECT
(SELECT 名前 FROM ユーザーテーブル WHERE ID=フェーズ1担当) AS フェーズ1担当
,(SELECT 名前 FROM ユーザーテーブル WHERE ID=フェーズ2担当) AS フェーズ2担当
,(SELECT 名前 FROM ユーザーテーブル WHERE ID=フェーズ3担当) AS フェーズ3担当

と書こうとしたが、何度もSELECTが走ると思い却下しました


初心者で申し訳ありません。
よろしくお願い致します。

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

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

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

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

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

Panzer_vor

2016/07/20 10:37

試してみたことなどがあれば、 質問文に追記していただいてよろしいですか。 質問文の内容だと丸投げにと捉えられかねないです。
Ogamary

2016/07/20 10:45

追記させて頂きました。 不慣れで申し訳ありません。ありがとうございます。
Panzer_vor

2016/07/20 10:46

追記確認致しました。ありがとうございます。 もう回答が出ておりますがパフォーマンスが気になるということでしたら、 shi_ueさんの回答が参考になると思われます。
Ogamary

2016/07/20 10:51

お陰様で解決することができました。 ありがとうございました!
guest

回答3

0

shi_ueさんの回答の補足となりますが
担当者テーブルに登録されたユーザIDが、
必ずユーザーテーブルに登録されていることが保証されている場合は、
INNER JOINで結合します。

そうでない場合はINNER JOINだとユーザーテーブルに存在しないIDの登録された担当者テーブルの情報が抜け落ちてしまうので、
もし担当者テーブルの情報は常に全部出したいのであればLEFT JOINを利用して下さい^^

投稿2016/07/20 10:52

編集2016/07/20 10:53
Panzer_vor

総合スコア1636

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

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

Ogamary

2016/07/20 13:40

ご回答ありがとうございます! 基本的にユーザーは全て担当者テーブルにいる前提ですが、 イレギュラーな場合を考慮してLEFT JOINで書こうと思います。 とても助かりました!
guest

0

ベストアンサー

担当者テーブルをtanto、ユーザーテーブルをuserとして

sql

1SELECT 2 job, 3 U1.name AS phase1_name, 4 U2.name AS phase2_name, 5 U3.name AS phase3_name 6FROM tanto AS T 7INNER JOIN user AS U1 ON (T.phase1=U1.id) 8INNER JOIN user AS U2 ON (T.phase2=U2.id) 9INNER JOIN user AS U3 ON (T.phase3=U3.id) 10ORDER BY T.job; 11```こんな感じでしょうか。

投稿2016/07/20 10:43

編集2016/07/20 10:46
shi_ue

総合スコア4437

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

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

Ogamary

2016/07/20 10:50

ご回答ありがとうございます! お陰様で希望の動作が実現できました! ありがとうございました。勉強になりました。
guest

0

大量なデータだと速度的に問題は有ります。

SQL

1select 案件名, 2(select 名前 from ユーザーテーブル wehre ID=フェーズ1担当) as フェーズ1担当, 3(select 名前 from ユーザーテーブル wehre ID=フェーズ2担当) as フェーズ2担当, 4(select 名前 from ユーザーテーブル wehre ID=フェーズ3担当) as フェーズ3担当 5from 担当者テーブル order by 案件名;

投稿2016/07/20 10:43

A.Ichi

総合スコア4070

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

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

Ogamary

2016/07/20 10:51

ご回答ありがとうございます! 同様の処理を考えてみたのですが、件数が増えた場合を考慮して諦めてしまいました。 お陰様で自分の理解を確認することが出来ました。ありがとうございました!
A.Ichi

2016/07/20 11:05

却下SQLでしたか! 確かに遅いしリソース沢山食う select T0.案件名, T1.名前, T2.名前, T3.名前 from 担当者テーブル T0 left join (select 案件名, 名前 from 担当者テーブル LEFT JOIN ユーザーテーブル ON ID=フェーズ1担当) T1 on T0.案件名=T1.案件名 left join (select 案件名, 名前 from 担当者テーブル LEFT JOIN ユーザーテーブル ON ID=フェーズ2担当) T2 on T0.案件名=T2.案件名 left join (select 案件名, 名前 from 担当者テーブル LEFT JOIN ユーザーテーブル ON ID=フェーズ3担当) T3 on T0.案件名=T3.案件名;
Ogamary

2016/07/20 13:38

追加のご回答ありがとうございます! このような書き方もできるんですね!参考にさせて頂きます。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問