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

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

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

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

Q&A

解決済

2回答

536閲覧

MySQLの複数テーブルを負荷のかからないSQLによって結合したい(1レコード中に複数のPKがあるケース)

tiqua_nibio

総合スコア62

MySQL

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

0グッド

0クリップ

投稿2019/09/07 16:56

例として、フォントファミリー名が収納されているテーブルを考えます。

mysql

1FONT_FAMILY 2---------------------------------------------------- 3ID | FONT_FAMILY_NAME 4---------------------------------------------------- 51 | 'MS 明朝', 'serif' 62 | Monaco,'Courier New',monospace 73 | 'MS ゴシック','sans-serif' 84 | '游明朝', 'Arial Black', 'Stencil Std' 95 | 'Batang', 'Arial Black' 10----------------------------------------------------

上記の定義カラム

別のテーブルには、

mysql

1FONT_STYLE 2---------------------------------------- 3ID | F_ID_01 | F_ID_02 | F_ID_03 4---------------------------------------- 51 | 3 | 3 | 1 62 | 1 | 4 | 1 73 | 1 | 5 | 1 84 | 2 | 1 | 1 9----------------------------------------

というふうに値を入れています。この2つのテーブルを結合して、下のようなテーブルを作りたいと思います。

mysql

1NEW_VIEW 2------------------------------------------------------------------------------------------------------------------------ 3ID | F_ID_01_NAME | F_ID_02_NAME | F_ID_03_NAME 4------------------------------------------------------------------------------------------------------------------------ 51 | 'MS ゴシック','sans-serif' | 'MS ゴシック','sans-serif' | 'MS 明朝', 'serif' 62 | 'MS 明朝', 'serif' | '游明朝', 'Arial Black', 'Stencil Std' | 'MS 明朝', 'serif' 73 | 'MS 明朝', 'serif' | 'Batang', 'Arial Black' | 'MS 明朝', 'serif' 84 | Monaco,'Courier New',monospace | 'MS 明朝', 'serif' | 'MS 明朝', 'serif' 9------------------------------------------------------------------------------------------------------------------------

ポイントとしては、FONT_STYLEの中にあるkeyはFONT_FAMILYのIDとつながっているということではありますが、1レコードの中に複数のkeyがあるということです。

結合する際に、下記の条件を考慮していただき、よいSQLがあれば教えていただければ幸いです。

・できるだけunion (all)を使わないで結合できないか。
・(または)サーバに負荷をかけないで結合できないか(Duration/Fetchが短ければありがたい)。

もし難しそうでしたら教えていただけますと幸いです。その時は、union allを使うことにします。

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

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

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

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

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

Orlofsky

2019/09/07 20:18 編集

PRIMARY KEYはひとつのテーブルにひとつだけ設定できます。ひとつのPRIMARY KEYには1つ以上のカラムを指定することができます。 質問にCREATE TABLE, CREATE INDEX を提示した方が適切なコメントが付きやすいです。
guest

回答2

0

ベストアンサー

この条件でぱっと思いつくのは↓のSQLですけど

SQL

1SELECT 2 FS.ID, 3 FF1.FONT_FAMILY_NAME F_ID_01_NAME, 4 FF2.FONT_FAMILY_NAME F_ID_02_NAME, 5 FF3.FONT_FAMILY_NAME F_ID_03_NAME 6FROM 7 FONT_STYLE FS 8LEFT JOIN 9 FONT_FAMILY FF1 10ON 11 FS.F_ID_01 = FF1.ID 12 13LEFT JOIN 14 FONT_FAMILY FF2 15ON 16 FS.F_ID_02 = FF2.ID 17LEFT JOIN 18 FONT_FAMILY FF3 19ON 20 FS.F_ID_03 = FF3.ID 21

むしろUNIONするやり方が思いつかない・・・

投稿2019/09/07 23:30

編集2019/09/08 11:57
shirokuma4690

総合スコア154

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

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

tiqua_nibio

2019/09/09 01:17

なるほど、同じテーブルでも複数joinさせるという方法もあるのですね。
guest

0

1 | 'MS 明朝', 'serif'

'MS 明朝' と 'serif' がセットになっている理由はなんですか?

2 | Monaco,'Courier New',monospace

シングルクォートで囲んであるのとないのとが混在しているのはなぜ?

ID | F_ID_01 | F_ID_02 | F_ID_03

F_ID_01, F_ID_02, F_ID_03 に振り分けるルールを明確にしてください。
これらの説明がないとコメントのしようがありません。

一般的には、データベースのテーブルはデータベースの正規化 に沿って設計します。通常、第3正規化まで行います。第1正規化で繰り返しを排除します。
通常、第3正規化まで行います。第1正規化で繰り返しを排除します。

投稿2019/09/07 17:46

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問