こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MYSQLで表の結合と検索

分かりやすくするために、テーブル名などは日本語で書きます。

曲名テーブルのアーティストはアーティストテーブルの番号から参照していて、
さらに、アーティストテーブルのアーティストは名前テーブルの番号から参照しています。

この場合に、曲名テーブルのアーティストを検索(例えば:「大塚愛」と検索)したいのですが、
検索してみても、なかなかピンとくる答えがありませんでした。

JOINで結合いいかと思いますが、テーブルから参照、さらにそのテーブルは、また別のテーブルから参照。
この様な場合はどうクエリーを書いたらいいか全くわかりません。
詳しい方宜しくお願いします。
現在、検証出来る環境がありません。

where 曲名 like '%大塚愛%'"


曲名テーブル
+---------------+---------------+---------------+
|................[番号]............|................[曲名]............|.......[アーティスト].....|
+---------------+---------------+---------------+

アーティストテーブル
+---------------+---------------+
|................[番号]............|.......[アーティスト].....|
+---------------+---------------+

名前テーブル
+---------------+---------------+---------------+
|................[番号]............|...............[名前]............|................[読み]............|
+---------------+---------------+---------------+

投稿日時 - 2014-09-29 20:09:43

QNo.8773087

すぐに回答ほしいです

質問者が選んだベストアンサー

Select
*
From "曲名テーブル" as t1

Left Join "アーティストテーブル" as t2
On t1."アーティスト番号1" = t2."番号"
Left Join "名前テーブル" as n_t1
On t2."アーティスト" = n_t1."番号"

Left Join "アーティストテーブル" as t3
On t1."アーティスト番号2" = t3."番号"
Left Join "名前テーブル" as n_t2
On t2."アーティスト" = n_t2."番号"

Where (n_t1."名前" like '%大塚愛%' or n_t2."名前" like '%大塚愛%')

純粋にorでどちらかがhitすれば出るようにしてるだけですね。
頂いた情報をもとに書くとすればこんな感じでしょうか。
作曲者と編曲も同じようにすれば大丈夫です。

投稿日時 - 2014-10-01 21:08:36

お礼

最後までお付き合いありがとうございます。
おかげさまでどうにかなりそうです。

投稿日時 - 2014-10-01 21:42:18

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

アーティストテーブルに曲と名が付随してると思ったのですが違うのですか??
まぁ、アーティストと名前テーブルの違いがよくわかってないのがいけませんね

ダミーでいいので実データいれたらどんな感じになるんですか?

こういうデータ構成かなと思ったんですが・・・
曲名テーブル
番号,曲名,アーティスト
1,さくらんぼ,1

アーティストテーブル
番号,アーティスト
1,1

名前テーブル
番号,名前,読み
1,大塚愛,おおつかあい

この文を読んでると
>さらに、下記のように、[アーティスト番号1]と[アーティスト番号2]から
>大塚愛やSMAPと検索したい場合はどうなりますでしょうか?
テーブルに対して私の認識違いがございますね

お答えにならなくてもいいのですが、業務、趣味または学校の宿題なんでしょうか?

投稿日時 - 2014-09-29 22:55:47

補足

もう少し詳しく書きます。
曲名テーブルのアーティスト番号1、アーティスト番号2、作詞、作曲は、
別のテーブルのアーティストテーブルや作詞テーブルから参照していて、
さらに、アーティストテーブルや作詞テーブルのデータは名前テーブルから参照しています。

この場合に、アーティスト番号1又はアーティスト番号2を検索し、結果を表示させたいです。

>お答えにならなくてもいいのですが、業務、趣味または学校の宿題なんでしょうか?

業務であるサイトのテスト用のプログラムが必要なのですが、
当方、あまり詳しくないので、こちらでお聞きしました。


曲名テーブル
+---------------+---------------+-----------------+-----------------+
|................[番号]............|................[曲名]............|..[アーティスト番号1]..|..[アーティスト番号2]..|
+---------------+---------------+-----------------+-----------------+

曲名テーブル(続き)
+-----------------+-----------------+
.|.................[作詞].................|...................[作曲].............|
+-----------------+-----------------+



アーティストテーブル
+---------------+---------------+
|................[番号]............|.......[アーティスト].....|
+---------------+---------------+

作詞テーブル
+---------------+---------------+
|................[番号]............|...............[名前]............|
+---------------+---------------+

作曲テーブル
+---------------+---------------+
|................[番号]............|...............[名前]............|
+---------------+---------------+

名前テーブル
+---------------+---------------+---------------+
|................[番号]............|...............[名前]............|................[読み]............|
+---------------+---------------+---------------+


↓、1000の番号はNullが入っています。

曲名テーブル

番号,曲名,アーティスト番号1,アーティスト番号2
1,さくらんぼ,1,1000
2,Wing my Way,2,1000
3,Rumbling Hearts,3,4
4,,仮面,8,1000

アーティストテーブル

番号,アーティスト
1,1
2,2
3,3
4,4
5,5
6,6
7,7
8,8
1000,,


作曲テーブル

番号,アーティスト
1,6
2,2
3,1
4,4
5,5
6,3
7,5
1000,,


作曲テーブル

番号,アーティスト
1,2
2,5
3,3
4,4
5,7
6,6
7,1
1000,,


名前テーブル

番号,名前,読み
1,大塚愛,おおつかあい
2,KOTOKO,ことこ
3,栗林みな実,くりばやしみなみ
4,石橋朋子,いしばしともこ
5,沢城みゆき,さわしろみゆき
6,いとうかなこ,いとうかなこ
7,水樹奈々,みずきなな
8,タッキー&翼
1000,,

投稿日時 - 2014-09-30 17:14:18

Select
*
From "アーティストテーブル" as t1
Left Join "名前テーブル" as t2
On t1."番号" = t2."番号"
Left Join "曲名テーブル"
On t1."アーティスト" = t2."アーティスト"
where t2."名前" like '%大塚愛%'

こういうことですか?
曲名はたとえば"さくらんぼ"とかですから、人名が入ってくるのは名前テーブルの名前では?


間違っていたら申し訳ないですが
読んでいてわかりやすくカラム名を日本語で一部を書き換えるとこうなるのかな?
曲名テーブル
+---------------+---------------+-------------------+
|................[番号]............|................[曲名]............|.......[アーティスト番号].....|
+---------------+---------------+-------------------+

アーティストテーブル
+-------------------+-------------------+
|................[名前番号]............|.......[アーティスト番号].....|
+-------------------+-------------------+

名前テーブル
+-------------------+---------------+---------------+
|................[名前番号]............|...............[名前]............|................[読み]............|
+-------------------+---------------+---------------+

こうすれば、正規化されてるかな・・・多分

投稿日時 - 2014-09-29 20:30:44

補足

回答ありがとうございます。

失礼しました。
質問にミスが有りました。
正しくは、
where 曲名 like '%大塚愛%'"
ではなく、
where アーティスト like '%大塚愛%'"
でした。

さらに、下記のように、[アーティスト番号1]と[アーティスト番号2]から大塚愛やSMAPと検索したい場合はどうなりますでしょうか?

同じく[アーティストテーブル]の[番号]から参照しています。

曲名テーブル
+---------------+---------------+-----------------+-----------------+
|................[番号]............|................[曲名]............|..[アーティスト番号1]..|..[アーティスト番号2]..|
+---------------+---------------+-----------------+-----------------+

投稿日時 - 2014-09-29 21:53:17

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-