MYSQLで表の結合と検索

このQ&Aのポイント
  • MYSQLで曲名テーブルとアーティストテーブル、名前テーブルを結合し、曲名テーブルのアーティストを検索する方法について教えてください。
  • JOINを使用してテーブルの結合を行い、曲名テーブルのアーティストを検索する方法について教えてください。
  • MYSQLのクエリーを使用して、曲名テーブルのアーティストを検索する方法について教えてください。
回答を見る
  • ベストアンサー

MYSQLで表の結合と検索

分かりやすくするために、テーブル名などは日本語で書きます。 曲名テーブルのアーティストはアーティストテーブルの番号から参照していて、 さらに、アーティストテーブルのアーティストは名前テーブルの番号から参照しています。 この場合に、曲名テーブルのアーティストを検索(例えば:「大塚愛」と検索)したいのですが、 検索してみても、なかなかピンとくる答えがありませんでした。 JOINで結合いいかと思いますが、テーブルから参照、さらにそのテーブルは、また別のテーブルから参照。 この様な場合はどうクエリーを書いたらいいか全くわかりません。 詳しい方宜しくお願いします。 現在、検証出来る環境がありません。 where 曲名 like '%大塚愛%'" 曲名テーブル +---------------+---------------+---------------+ |................[番号]............|................[曲名]............|.......[アーティスト].....| +---------------+---------------+---------------+ アーティストテーブル +---------------+---------------+ |................[番号]............|.......[アーティスト].....| +---------------+---------------+ 名前テーブル +---------------+---------------+---------------+ |................[番号]............|...............[名前]............|................[読み]............| +---------------+---------------+---------------+

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

  • ベストアンサー
noname#209234
noname#209234
回答No.3

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すれば出るようにしてるだけですね。 頂いた情報をもとに書くとすればこんな感じでしょうか。 作曲者と編曲も同じようにすれば大丈夫です。

IrohaKujoh
質問者

お礼

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

その他の回答 (2)

noname#209234
noname#209234
回答No.2

アーティストテーブルに曲と名が付随してると思ったのですが違うのですか?? まぁ、アーティストと名前テーブルの違いがよくわかってないのがいけませんね ダミーでいいので実データいれたらどんな感じになるんですか? こういうデータ構成かなと思ったんですが・・・ 曲名テーブル 番号,曲名,アーティスト 1,さくらんぼ,1 アーティストテーブル 番号,アーティスト 1,1 名前テーブル 番号,名前,読み 1,大塚愛,おおつかあい この文を読んでると >さらに、下記のように、[アーティスト番号1]と[アーティスト番号2]から >大塚愛やSMAPと検索したい場合はどうなりますでしょうか? テーブルに対して私の認識違いがございますね お答えにならなくてもいいのですが、業務、趣味または学校の宿題なんでしょうか?

IrohaKujoh
質問者

補足

もう少し詳しく書きます。 曲名テーブルのアーティスト番号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,,

noname#209234
noname#209234
回答No.1

Select * From "アーティストテーブル" as t1 Left Join "名前テーブル" as t2 On t1."番号" = t2."番号" Left Join "曲名テーブル" On t1."アーティスト" = t2."アーティスト" where t2."名前" like '%大塚愛%' こういうことですか? 曲名はたとえば"さくらんぼ"とかですから、人名が入ってくるのは名前テーブルの名前では? 間違っていたら申し訳ないですが 読んでいてわかりやすくカラム名を日本語で一部を書き換えるとこうなるのかな? 曲名テーブル +---------------+---------------+-------------------+ |................[番号]............|................[曲名]............|.......[アーティスト番号].....| +---------------+---------------+-------------------+ アーティストテーブル +-------------------+-------------------+ |................[名前番号]............|.......[アーティスト番号].....| +-------------------+-------------------+ 名前テーブル +-------------------+---------------+---------------+ |................[名前番号]............|...............[名前]............|................[読み]............| +-------------------+---------------+---------------+ こうすれば、正規化されてるかな・・・多分

IrohaKujoh
質問者

補足

回答ありがとうございます。 失礼しました。 質問にミスが有りました。 正しくは、 where 曲名 like '%大塚愛%'" ではなく、 where アーティスト like '%大塚愛%'" でした。 さらに、下記のように、[アーティスト番号1]と[アーティスト番号2]から大塚愛やSMAPと検索したい場合はどうなりますでしょうか? 同じく[アーティストテーブル]の[番号]から参照しています。 曲名テーブル +---------------+---------------+-----------------+-----------------+ |................[番号]............|................[曲名]............|..[アーティスト番号1]..|..[アーティスト番号2]..| +---------------+---------------+-----------------+-----------------+

関連するQ&A

  • mySQLの内部結合について

    現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか?

    • ベストアンサー
    • MySQL
  • mysqlをphpでいじってるんですが・・・

    実はややこしいテーブルを作ってしまって、データの加工に困っています。 ひとつのテーブル内に二つ、同じ外部テーブルを参照するテーブルです。 joinでひとつは結合できたのですがもうひとつはうまくいきません。この場合なにかよい解決策はありませんか?

    • ベストアンサー
    • PHP
  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • テーブルの結合時に空のカラムに『NULL』を入れない方法について

    宜しくお願いします。 MySQLでleft joinでテーブルの結合を行った際に、表示に必要なカラムのみを定義した場合に、空のカラムに『NULL』が入ってしまい、絞込みで検索時にこの『NULL』が邪魔になり、きちんと検索できません。left joinでテーブルを結合する場合に空のカラムに『NULL』が入らない様にする方法はありますか? クエリ文 select a.column1,b.column2 from a left join b on a.column3 = b.column3 where column2 like '%%'; 上記の様に検索した場合、likeで曖昧検索の上、検索内容を指定していないので、全データが検索されるかと思ったのですが、テーブルbのcolumn2が空のカラムは検索されず、HIT数が減ります。このwhereは必須で、どうしても入れなければならない状況なので、空のカラムも検索する方法があると助かります。 何卒、ご教授の程、宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 表の結合(性能)

    2つのテーブルを(内部)結合させる場合、 INNER JOINによる結合と WHERE句に結合条件を記述する2通りの方法が あると思いますが、どちらが早いのでしょうか? なお、Oracle9i、ルールベースにて構築されています。 テーブルの内容、SQL文は下記のとおりです。 ご教授よろしくお願いします。 ■表 A 項目A-1 ・・・PRIMARY KEY1、INDEX1 項目A-2 ・・・PRIMARY KEY2、INDEX2 項目A-3 ・・・PRIMARY KEY3 項目A-4 ■表 B 項目B-1 ・・・PRIMARY KEY1、INDEX1 項目B-2 ・・・PRIMARY KEY2、INDEX2 項目B-3 ・・・PRIMARY KEY3 項目B-4 ※項目A-1と項目B-1にて結合。  項目A-2が"01"と等しいレコード。 表Aのレコード件数>表Bのレコード件数 【WHERE句にて結合】 SELECT * FROM A,B where A.項目1 = B.項目1 and A.項目2 = '01' 【INNER JOINにて結合】 SELECT * FROM A INNER JOIN A ON A.項目1 = B.項目1 AND A.項目2 = '01'

  • MySQL 外部結合後にWHERE検索できない

    ■質問内容: 超初心者です。質問が的外れかもしれませんが自己解決できずにいます。何卒ご教授ください。(完全)外部結合して、WHEREを使って検索(未解決)したい何が原因で検索できないのかわかりません。 ■環境: MySQL:5.0.45(win32) php:5.2.5(win32) ■状況と経緯: ブログのような形式で、 記事(親)にコメント(子)を追加できるように、 TABLEを親、子と2つ作成しています。 この2つのテーブルを、外部結合しました。 完全外部結合を達成するために、LEFT OUTER JOIN,UNION,RIGHT OUTERJOIN を使用してテーブルを結合しています。 この結合後に、WHEREでLIKE検索をしてみると、結合した全てのデータが表示されてしまい検索条件がHITしなくなってしまいました。 左外部結合(LEFT OUTER JOIN)の場合はWHEREでLIKE検索が実行できていました。出来ないことを試みようとしているのか、それとも構文間違いないのか、書籍やネットでの情報を試行錯誤してみましたが解決に至りません。書籍片手に試行している超初心者です。この事案に困り果てています。ご教授いただければ助かります。宜しくお願い致します。 ■検索結果の表示を行うPHP抜粋(search.php) /* 検索画面からの入力条件を変数で受け取り */ $kanriban_Reco_fp = "-1"; if (isset($_GET['kanriban'])) { $kanriban_Reco_fp = $_GET['kanriban']; } $hakken_Reco_fp = "-1"; if (isset($_GET['hakken'])) { $hakken_Reco_fp = $_GET['hakken']; } $hiniti_Reco_fp = "-1"; if (isset($_GET['hiniti'])) { $hiniti_Reco_fp = $_GET['hiniti']; } $gen_Reco_fp = "-1"; if (isset($_GET['gen'])) { $gen_Reco_fp = $_GET['gen']; } $dare_Reco_fp = "-1"; if (isset($_GET['dare'])) { $dare_Reco_fp = $_GET['dare']; } $pgba_Reco_fp = "-1"; if (isset($_GET['pgba'])) { $pgba_Reco_fp = $_GET['pgba']; } $kiiwa_Reco_fp = "-1"; if (isset($_GET['kiiwa'])) { $kiiwa_Reco_fp = $_GET['kiiwa']; } /* データベース"work"のテーブルFとテーブルPを(完全)外部結合し、WHERE後にLIKE検索でHITした結果を一覧化するための処理*/ /* テーブルFOは、f. テーブルPOは、p. で表現しています。 . に続く内容は、フィールド名です。(レコードセット名をfpと任意に付けています)*/ mysql_select_db($database_work, $work); $query_Reco_fp = sprintf("SELECT f.id, f.hakkensya, f.bajyon, f.naiyou, f.houkokusaki, f.kigen, f.jyoukyou, f.tourokubi, f.tantou, f.nin, f.syurui FROM fo f LEFT OUTER JOIN po p on f.id = p.id union SELECT f.id, f.hakkensya, f.bajyon, f.naiyou, f.houkokusaki, f.kigen, f.jyoukyou, f.tourokubi, f.tantou, f.nin, f.syurui FROM fo f RIGHT OUTER JOIN po p on f.id = p.id WHERE f.id LIKE %s AND f.hakkensya LIKE %s AND f.kigen LIKE %s AND f.houkokusaki LIKE %s AND f.jyoukyou LIKE %s AND f.bajyon LIKE %s AND f.naiyou LIKE %s AND p.id LIKE %s AND p.topinamae LIKE %s AND p.topikigen LIKE %s AND p.topihoukokusaki LIKE %s AND p.topinaiyou LIKE %s AND p.id LIKE %s ORDER BY id ASC", --以上-- 一覧表示のHTMLには、結合した全ての内容が、一覧表示されてしまいます。検索条件を無視している?? 何卒、宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルを結合する構文はUNIONやJOINがありますが

    テーブルを結合する構文はUNIONやJOINがありますが この場合クエリー速度は1本のテーブルと複数のテーブルではどの程度 違うのでしょうか? また物理的に複数のテーブルを1つにしたい場合に何かいい方法は ないでしょうか。

    • ベストアンサー
    • MySQL
  • テーブル結合時のあいまい検索について

    はじめまして。Oracle9iでテーブル結合時のあいまい検索を行いたいのですが、エラーが起こってしまいます。 形としては、 SELECT TABLE1.A, TABLE1.B, TABLE1.C, TABLE2.D, TABLE2.E, TABLE2.F FROM TABLE1, TABLE2, WHERE TABLE1.A = TABLE2.D(+) というような形です。ここで、TABLE1のBとCに「%あ%」というあいまい検索をしたいのですが、上記の文に続いて、 AND TABLE1.B LIKE '%あ%' OR TABLE1.C LIKE '%あ%' と続けて実行すると、 ORA-01719: outer join operator (+) not allowed in operand of OR or IN というエラーになってしまいます。 こういった場合はどう対処すればよろしいのでしょうか?SQLについてほとんどわかりませんが、よろしくお願いします。

  • 他のDBのテーブルと内部結合が可能でしょうか

    他のDBのテーブルと内部結合が可能でしょうか sql sever 2005 を使用します。このたび、データベースAのテーブルaを定期的に検索するsqlを作成することになりました。このsql文は、ストアードプロシージャとして登録予定です。 その際、テーブルbを内部結合で参照します。例として、テーブルaは社員番号があり、テーブルbは社員番号、社員名があります。(テーブルbは社員マスター) テーブルaを参照し、その社員名を内部結合(INNER JOIN)で取り出します。 ここで、テーブルa,bが共に、同じデータベース内にある場合は、問題ないのですが、 テーブルbは、別のマシンのsql sever 上にあります。(したがって、データベース名も異なります) このような状態で、内部結合による参照は可能でしょうか? また、内部結合ができないまでも、ストアードプロシージャで、データベースAのテーブルaを参照しながら、別のマシンのデータベースBのテーブルbを参照することは、原理的に可能でしょうか。 なお、データベースは共にsql server 2005を使用します。

  • MySQLで複数データベースの検索/ソートについて

    お世話になっております。 PHP4.4.1+MySQL4.1.15を使用しております。 複数のデータベースに含まれる複数のテーブルをひとつの大きなテーブルとして検索/ソートする方法はありませんでしょうか? 結合ではなく、全レコードを全て単体として検索/ソートをかけたいのです。 それぞれのデータベースに含まれるテーブルに、共通の項目があり、その共通の項目順にソートしたり、絞込をかけたりしたいのですが、調べてみても、どうしても結合(JOIN)に行き着いてしまいます。 JOINによる結合だと、共通の項目以外のレコードが表示されないので、これでは意味をなしません。 ご教授の程、お願い致します。

    • ベストアンサー
    • MySQL