mySQL複数テーブルから検索 - キャスト情報、写真、出勤時間の取得方法

このQ&Aのポイント
  • mySQLを使用して、複数のテーブルからキャスト情報、写真のURL、出勤時間を取得する方法を教えてください。
  • キャストのリストを表示するために、castテーブル、photoテーブル、scheduleテーブルから必要な情報を結合し、期待する結果を得る方法を教えてください。
  • 写真データがない場合にも正しく表示するために、適切なSQL文を提案していただきたいです。
回答を見る
  • ベストアンサー

mySQL 複数テーブルから検索したい

はじめまして、よろしくお願いします。 職場環境がかわり、はじめてmySQLを使用しています。 3つのテーブルから情報を検索したいのです。 [テーブル名: cast] name             // PRIMARY KEY age (例 なまえ1, 22 なまえ2, 28 なまえ3, 25 [テーブル名: photo] name order             // 写真表示順 (INT) url               // 写真格納先URL (例 なまえ1, 0, http://なまえ1A.jpg なまえ1, 1, http://なまえ1B.jpg なまえ1, 2, http://なまえ1C.jpg なまえ3, 0, http://なまえ3A.jpg [テーブル名: schedule] name workday           // 出勤日 (DATE) starttime          // 出勤時間(TIME) finishtime          // 退勤時間(TIME) (例 なまえ3, 2013-02-04,  9:00, 17:00 なまえ2, 2013-02-05, 10:00, 18:00 なまえ2, 2013-02-06, 10:00, 18:00 なまえ2, 2013-02-07, 10:00, 18:00 キャスト情報(cast)とそのキャストの写真格納先URL(photo)とキャストの出勤時間(schedule)のテーブルです。 ※キャストは何枚でも写真を登録できます。登録していない場合もあります。 キャストのリストを表示したいです。 表示したい項目は cast.name, cast.age, photo.url, schedule.starttime, schedule.finishtime になります。 期待する結果は(2月5日の場合) なまえ1, 22, なまえ1A.jpg, NULL, NULL なまえ2, 28, NULL,     10:00, 18:00 なまえ3, 25, なまえ3A.jpg, NULL, NULL すべてのキャストを表示します。 photo.urlはphoto.order=0のもの(photo.order=0の写真をサムネイル表示に使っています) 2月5日に出勤情報があれば表示 いろいろ考えたのですが、どうしても photo にデータがない("なまえ2")のところでつまづいてしまって、どうにも。。。 とりあえずPHPでそれぞれのテーブルの情報を取得して 自分で UNION、 USING('name') みたいな処理してますが、ソースがとっても恰好悪いです。 ズバッとしびれるSQL文をどうかご教示していただきたく、投稿しました。 よろしくお願いいたします><

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

こんな感じですか? select cast.name,cast.age,photo.url,schedule.starttime,schedule.finishtime from cast left join photo on cast.name=photo.name and photo.order=0 left join schedule on cast.name=schedule.name and schedule.workdate='2013-02-05' なお、カラムにcastやorderといった予約語をいれると思わぬ落とし穴があったりするので 気をつけてください

ap3824
質問者

お礼

素晴らしいです! ありがとうございます。 教えていただいたSQL文に使われている命令をよく調べて勉強して わたしも、サラッ!と書けるようになりたいです。エクセレント!!! また、予約語の件了解しました。 こちらもほかにどのような予約語があるか勉強してカラム名を変更します。 本当にありがとうございます^^

関連するQ&A

  • MySQLでの複数テーブル(4つ)への検索について

    はじめまして、こんばんは。 現在、ECサイトを構築中なのですが、MySQLにPHPから検索をかけたいのですが、どうにも詰まってしまったので、投稿させて頂きました。 PHPバージョン:PHP 5.2.6 DBバージョン:MySQL 4.1.22 機能としては、購入履歴から、購入商品のランキングを作りたいと思っております。 ランキング自体の表示はOKなのですが、そこに商品のカテゴリーを表示させたいのです。 関係するテーブルは以下の通りです。 【order】購入履歴テーブル product_id:商品ID 【products】商品テーブル product_id:商品ID name:商品名 image:商品画像 【p_category】商品カテゴリーテーブル product_id:商品ID category_id:カテゴリーID 【category】カテゴリーテーブル category_id:カテゴリーID category_name:カテゴリー名 parent_category_id:親カテゴリーID 【表示させたい項目】 product_id:商品ID name:商品名 image:商品画像 category_id:カテゴリーID category_name:カテゴリー名 parent_category_id:親カテゴリーID 現在のソースは以下の通りです。 --------------------------------------- SELECT   count(o.product_id) as rank,   name,   image,   p.product_id FROM   order as o,   products as p WHERE   o.product_id=p.product_id GROUP BY   name,   image,   p.product_id ORDER BY   rank desc limit 5 --------------------------------------- 上記にプラスしたいのは、 p.product_idと【p_category】のproduct_idが一致したcategory_idを取得して、【p_category】のcategory_idと【category】category_idが一致したcategory_name、parent_category_idも取得したいです。 分かりにくいうえに、長文になってしまいましたが、ご指導・ご鞭撻のほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • mysql order by のNULLについて

    mysql order by のNULLについて テーブル tb1 memberid 2   2 cardid  1   1 name 田中  井岡 day 2016.4.10  2016.4.22 new  New NULL ソース SELECT memberid,cardid,max(name),max(day),max(new) FROM tb1 WHERE memberid=2 GROUP BY cardid ORDER BY max(day) DESC LIMIT '.$limit.' OFFSET '.$offset; すると max(new)の部分が Newと出てきます。 max(new)なのでNULLが出てくると思っていました。 NULLにしたいのですが 名前も井岡ではなく田中がでてきます max(day)をオーダーしているので新しい日の情報が出てくると思っていましたが。。。。 何か SQLの書き方に問題があるのでしょうか それともこのテーブルの作りでは不可能なのでしょうか? 無知な私に ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • mysql 複数テーブルの条件付け摘出

    こんにちは。 初歩的なことだと思うのですが、複数テーブルからのレコード摘出で躓いてしまったのでご教授ください。 以下のような2つのテーブルがあったとして、 table_a ---------------- acount_no / name 1 / aaa 2 / bbb table_b ---------------- acount_no / value / update_at 1 / 0000 / 2012-05-12 2 / 3333 / 2012-05-12 1 / 1111 / 2012-05-13 2 / 5555 / 2012-05-13 table_aのacount_noとnameは必ず必要で、table_bのupdate_atに対応するvalueを条件付けで取り出したい場合はどのようにしたら良いのでしょうか。 レコードに存在しない日付を指定したときには、空欄で欲しいのですが・・・、 acount_no / name / value 1 / aaa / null 2 / bbb / null 例えば、 select a.acount_no,name,value from table_a as a LEFT JOIN table_b as b ON a.acount_no = b.acount_no where b.update_at = '2012-05-14' order by a.acount_no asc とすると結果が0行になってしまいます。 外部結合の使い方が間違っているのでしょうか・・・。 お力添えの程、宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • MySQLでのテーブル作成

    MySQLでこういったテーブルを作成したのですが、 CREATE TABLE NOSGI ( GNRE_CD CHAR(5) NOT NULL, GNRE_NAME VARCHAR(20) NOT NULL, PRIMARY KEY (GNRE_CD) ); GNRE_CDはCHAR型で作成したのに、カラムの情報を見ると、 VARCHAR型にしまうのですが、どうしてでしょうか?

  • 3.23系MySQLでのEXCEPT検索について

    ver3.23のMySQLとPerlでデータベースを作っています。 検索方法でちょっと詰まってしまったので、 質問させていただきます。 以下のようなテーブルがあるとします。 tableA(基本名簿) AID name sr 1  aaa 100 2  bbb 100 3  ccc 100 4  ddd 100 5  eee 100 6  fff 200 tableB(対応履歴) BID cr 1  40 1  50 1  60 3  40 3  50 3  60 AIDはBIDに対応します。 ここでやりたいのは、 「'sr'が100であり、なおかつ'cr'が40ではない(結合後のテーブルにおいてnullである)tableAのレコードを取り出す」 ということです。 以下のような結果が理想です。 AID name cr  sr 2  bbb null 100 4  ddd null 100 5  eee null 100 いろいろ試した結果、 AID name cr  sr 1  aaa 40  100 2  bbb null 100 3  ccc 40  100 4  ddd null 100 5  eee null 100 このような結果が出る段階まではたどり着きました。 以下がそのコードです。 SELECT * FROM tableA as A left join tableB as B on A.AID = B.BID and cr =40 WHERE sr = 100 order by AID 以上のような結果が出たので、 三行目に"and cr != 40"や"and cr = null"などを足してみたのですが、 結果はemptyでした。 NOT EXISTSを最初は試みたのですが、 よく読んだらバージョンが古くて使えませんでした。 混乱しすぎて何か基本的な事をおろそかにしている気もするのですが… わかる方いらっしゃいましたらぜひご教示くださいませ。

    • ベストアンサー
    • MySQL
  • 複数テーブルを検索するクエリの実行時間を短縮したい

    feedというテーブルには site_name, site_url, feed_name, feed_url, date, count feed_urlがプライマリーの6つのフィールドがあり、 siteというテーブルには site_name, site_url, first_date, last_date site_urlがプライマリーの4つのフィールドがあります。 feedテーブルのsite_urlとsiteテーブルのsite_urlには全く同じものが入っています。 この二つのテーブルを用いて、以下のような条件でレコードを取り出したいです。 ・site_urlごとのfeed.countの平均値を取得 ・取得した平均値をソート(DESC) ・一週間前までのfeed.dateの中から ・site_urlとsite_nameとfirst_dateとlast_dateと算出した平均値を取り出したい 以下のようなSQL文を作ってphpMyAdminから実行してみたのですが、2秒ほどかかってしまいました。より高速に取り出すことはできますでしょうか? //0.5程度で終わる //これプラスsiteテーブルのfirst_dateとlast_dateも取り出したい。 SELECT site_name, site_url, AVG( count ) FROM `feed` WHERE DATE > '2011-01-10 00:00:00' GROUP BY site_url ORDER BY AVG( count ) DESC LIMIT 0 , 30 //2秒ほどかかる //目的のレコードが取り出せる。 //このSQLを高速化したい。 SELECT site.first_date, site.last_date, feed.site_name, feed.site_url, AVG( feed.count ) FROM `feed` , `site` WHERE feed.date > '2011-01-10 00:00:00' AND feed.site_url = site.site_url GROUP BY feed.site_url ORDER BY AVG( feed.count ) DESC LIMIT 0 , 30 できれば1秒以内が理想なのですが、そこまで高速にすることは可能でしょうか? もし可能な場合は、そのSQL文を教えて頂ければ幸いです。(1秒以内でなくても高速になれば嬉しいです。) よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 3つのテーブルから情報一覧を作りたいです。

    こんばんは。 いつもお世話になっております。 レンタルしているサーバーがMySQL4.0.22なので サブクエリが使用できません……。 どうしても、3つのテーブルからの情報を 一覧で表示させたいのですが、どう記述すれば 良いのでしょうか…? どうかご指導よろしくお願い申し上げます。 【使用環境】 MySQL4.0.22 PHP4.3.11 【MySQL テーブル構造】 ■name (テーブル) nkey(nameテーブル主キー) name(名前) age(年齢) sei(性別) tou(登録日) fuken(居住区) kahi(掲載可否) ■sousyoku(装飾テーブル) soukey(主キー) kao(顔型) hear(髪型) ue(上着) sita(下着) kutu(靴) motimono(アイテム) ■soubi(装備登録テーブル) soukey nkey 上記のテーブルから、PHPでHTML出力した時に 下記のような表にして、登録内容の一覧を見たいのです。 【出力テーブルイメージ】 名前┃可否┃登録日┃顔型┃髪型┃上着┃下着┃靴┃アイテム -------------------------------------------------- 田中┃可 ┃2006/04/01┃10┃2┃3┃4┃12┃NULL┃NULL┃ ------------------------------------------------- 佐藤┃否 ┃2005/01/12┃NULL┃1┃3┃4┃NULL┃NULL 【備考】 装備は、今後増減する可能性があります。 装備の番号は、それぞれ専用のテーブルがあり、 髪型KEY1はアフロで髪型KEY2はちょんまげで… などと、こまかく分けているのですが、そこまで 出そうとすると、4つのテーブルからの表示になり さらに難しくなりそうなので、最初の段階として 番号で表示できればと考えています。 よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • mysql と php で、2テーブル結合の検索!

    mysql と php を勉強しはじめで、解からないので、どなたか教えてください! 2テーブルあります。( 例 ’name’ と ’jusyo’ テーブルです。) ’name’テーブルは、NO int、IC_NO char(5)、NAME char(18)、 ・・・・・です。 ’jusyo’テーブルは、NO int、NAME_KANA char(30)、TEL char(6)、JUSYO char(50)、 ・・・・です。 この2テーブルを、《NO int、》で、左結合(レフトジョイン)させます。 テキスト入力フィールド、があり、検索ボタンで検索させようと思っています。 テキスト入力フィールドには、IC_NO を入力し、’jusyo’テーブルの、NAME_KANA TEL JUSYO・・・ を表示させたいと思っています。 <?php extract($_POST); echo " <form action=\"kensaku2.php\" method=\"post\" > <p>検索番号 : <input type=\"text\" name=\"nam\" value=\"$nam\" size=\"10\">   <input type=\"submit\" value=\"検索\"></p>\n </form> "; if($nam<>''){ mysql_connect('localhost','root','******'); mysql_select_db('データベース名'); $sql= "select * from name left join jusho on NO=NO"; $sql= "select * from name where IC_NO like '%$nam%'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>\n"; } else { while($row = mysql_fetch_array($result)){ echo "詳細情報"; echo "<br />\n"; echo "<br />\n"; echo "インター名 : "; echo $row["NAME_KANA"]; echo "     "; echo "<p>";               ↓ としてますが、NAME_KANAが表示されません、どこが間違っていますか? 考え方がおかしいのでしょうか?

  • MySQLの行儀のいいテーブルってどんなのですか?

    独学なので、どういったものが行儀がいい、もしくは、きちんとしたテーブルの構成なのか分かりません。 とりあえず悩んでいるのが、テーブルを二つに分けるか、一つのままにするかです。 フリーのMySQLの掲示板を見ると、名前、パスワード、コメントが一つのテーブルもあります。 私は、ユーザー情報を他でも利用したいので、自作で ユーザーテーブル ID、名前、パスワード BBSテーブル  ID、コメント と、したいのです。 とはいえ、書き込み時に二つのテーブルに書き込み。 表示の時は、結合してから、表示。 サーバの負荷は、テーブルが一つの時と比べて、どれくらい違うのでしょうか? 普通開発する時は、テーブルの数は意識するものなんでしょうか? 前に、「個人のHPのデーターベースでは、無茶してもOK」(かなりの意訳あり)とお許しを頂いたので、負荷の事は気にしない事にしたのですが。 テーブル一つで作成したので、作り替えるのが面倒で、okwebで現実逃避しているという事もなきにしもあらずです。

    • ベストアンサー
    • MySQL
  • 以下のSQLについて

    AccessMDBで、以下のテーブルがあったとします。 テーブル1 ID,NAME 1,おなまえ 2,名前 3,なまえ テーブル2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 このとき、以下のように出力したいのですが ID(オートナンバーと仮定),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) 試しにクェリーを作ってみた所、(null)の値を手入力しなければいけないのですが nullをいれさせるようにするには、どのようにしないといけないでしょうか? #テーブルをいじることはできず、SQLのみで対処することを考えています。 SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.START, テーブル2.END FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID UNION SELECT テーブル1.NAME, テーブル2.NAME,テーブル2.START,テーブル2.END FROM テーブル1; よろしくお願いします。