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

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

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

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

Q&A

解決済

2回答

8097閲覧

mysql 中間テーブルを用いての参照

HideoNegishi

総合スコア10

MySQL

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

0グッド

0クリップ

投稿2016/06/28 01:28

編集2016/06/28 03:05

以前、MySQLで以下の質問をしました。


外部結合してデータを参照する際、複数の同一カラムに複数の値を持たせて結合させたいのですが、どうすれば良いかわかりません。

例えば

m_user
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
| user_id(int 4) | user_name(varchar 24) | skill_code(FK varchar 4) |
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ex)0000 山田 0000

m_skill
ーーーーーーーーーーーーーーーーーーーーーー
| skill_code(int 4) | skill_name(varchar 24) |
ーーーーーーーーーーーーーーーーーーーーーー
ex) 0000 java
0001 PHP

などとして、skill_codeで結合します。
今、m_userにskill_code一つしか結合できていません。
複数のskill_codeを結合したい場合、どうすればよいでしょうか。

よろしくお願いいたします。


ご回答としては、中間テーブルを作れば良いというご指摘をいただきました。

m_user_skill
ーーーーーーーーーーー
| user_id | skill_code |
ーーーーーーーーーーー

そこで今回は、以下の結果を参照する際、どのようなSELECT文を打てば良いのでしょうか。

ーーーーーーー
| 山田 | java |
| | php |
ーーーーーーー

*実行したselect文
SELECT
user.user_name
,skill.skill_name
FROM
(
runners_db.m_user_skill user_skill
LEFT OUTER JOIN runners_db.m_user USER
ON user_skill.user_id = user.user_id
)
LEFT OUTER JOIN runners_db.m_skill skill
ON user_skill.skill_code = skill.skill_code;

*結果
ーーーーーーーー
| 山田 | java |
| 山田 | PHP |
| 山田 | MySQL |
ーーーーーーーー

よろしくお願いいたします。

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

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

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

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

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

tanat

2016/06/28 02:26

MySQLのJOINについてどの程度把握されていますか? また、今回のケースで実際に試してみたSQL文があれば書いてください。 現在の質問のままだと非推奨な質問 https://teratail.com/help/avoid-asking に当たってしまうかもしれません。
HideoNegishi

2016/06/28 03:02

お返事ありがとうございます。 基本的な結合はできているつもりですが、この場合どうすれば良いかわかりませんでした。 自分でとりあえず実行してみたSELECT文を追記させていただきます。
guest

回答2

0

まず、中間テーブルというものを作ります。
m_user.user_idに対して、m_skill.skill_codeは複数ある事もあるという事で、これは多対多のリレーションです。
こういった場合には中間テーブルを作成し、中間テーブルからSELECT文を叩いて引っ張ってきます。

先ほど簡単に試してみたものを紹介します。

まず適当にskill_listを作成します(これが中間テーブルです)
カラム内にはuser_id、skill_codeを格納します。
create table skill_list (user_id int(4), skill_code int);
適当に作ったので型とかはそちらで修正してください。

インデックスを作成します。
alter table m_user add index id(user_id);
alter table m_skill add index id(skill_code);

外部キーを設定します。
alter table skill_list add foreign key(user_id) references m_user(user_id);
alter table skill_list add foreign key(skill_code) references m_user(skill_code);

あとは、中間テーブルに対してSELECT文を打ち込めばできます。
SELECT user_id, skill_code FROM skill_list; ←これに抽出したい条件を好きなように変えます。

少し足早に説明しましたし、SQL文もあくまで参考として載せています。でも多分動くとは思います。
動かなければ「外部キー」や「インデックス」なんかで調べると良いです。

仕組みとしては、最初に作られた二つのテーブルの主キーにあたるidとcodeを中間テーブルにつなげて、その中間テーブルにSELECT文を打てば結果が返ってくるという仕組みです。

投稿2016/06/28 03:22

hishiwanko

総合スコア40

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

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

HideoNegishi

2016/06/28 03:26

お時間とお手間ありがとうございます! やはりそういうSELECT文になりますよね。
guest

0

ベストアンサー

追記ありがとうございます。
結論としては、現在のSQLが正解の一つで、

求めている形の
ーーーーーーー
| 山田 | java |
| | php |
ーーーーーーー
というのがRDBMS的な結果になっていないため、
「お求めのSQLは存在しません」という回答になってしまいます。

RDBMSの結果はあくまでレコード単位(横一行が一つの単位)であって、
求められているような形はレコード同士がの縦の関係性を持ってしまっているため、
RDBMS以外のところで実現しないといけないところです。

なので例えば
| 山田 | java | PHP |
の様な形に落とし込むというのであれば可能性はありますが、これはこれでデータとして使いやすいかと言うと微妙かと思います。

MySQL単体でアプリケーション開発をされているという事は無いでしょうから、
現在取得できている形をSQLを実行している側のプログラム言語に渡して、
そちらで整形するという方向はいかがでしょうか?

投稿2016/06/28 03:21

tanat

総合スコア18709

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

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

HideoNegishi

2016/06/28 03:27

ご回答ありがとうございます! やはりそうですよね。 javaWebアプリケーションなので、javaで整形してみます!
tanat

2016/06/28 03:32

その場合は、user_id、skill_codeも一緒に結果に含ませると扱いやすいかと思います。 頑張ってください!
HideoNegishi

2016/06/28 03:36

確かに!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問