- ベストアンサー
MAX関数を使ってからLEFT JOINしたいのですが・・
毎度お世話になります。 下記2つのテーブルからテーブル結合をして表示させたいのですが、その前にサブテーブルにある時間データの中で最新のものだけと結合したいと考えています。色々試したのですがうまくいきません。どなたかご教授の程よろしくお願いいたします。 main_tbl | id | basyo | name | --------------------- | 1 | 1 | aa | | 2 | 1 | bb | | 3 | 2 | cc | | 4 | 3 | dd | sub_tbl | id | jyotai | time | ------------------------ | 1 | 1 |12:25:30| | 1 | 2 |13:15:12| | 2 | 1 |13:20:14| | 1 | 3 |13:50:08| 欲しい結果 | id | basyo | name | jyotai | time | --------------------------------------- | 1 | 1 | aa | 3 |13:50:08| | 2 | 1 | bb | 1 |13:15:12| | 3 | 2 | cc | null | null | | 4 | 3 | dd | null | null | 考えた構文 $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN (SELECT MAX(time) FROM sub_tbl GROUP BY id) ON main_tbl.id = sub_tbl.id"; または $sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN sub_tbl on main_tbl.id = sub_tbl.id WHERE SELECT MAX(time) FROM sub_tbl GROUP BY id"; または $sql1 = "SELECT MAX(time) FROM sub_tbl GROUP BY id"; $rs1 = mysql_db_query($db,$sql1) or die("sql Error!"); $sql = "SELECT main_tbl.id, main_tbl.basyo,main_tbl.name, $rs1.jyotai, $rs1.time FROM main_tbl LEFT OUTER JOIN $rs1 ON main_tbl.id = $rs1.id"; ~以下クエリの実行と表示文~ どれも駄目でした。(クエリエラー表示) 因みに結合のみとMAX関数を別々に実行すると表示できることを確認しています。 環境は WinXP Mysql5.0.41 php5.2.3 です。 まだまだ勉強中ですのでよろしくお願いいたします。
- masmos
- お礼率100% (3/3)
- PHP
- 回答数2
- ありがとう数4
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
もう少しすっきりした文になるかも知れませんが、とりあえず以下のSQL文でどうでしょう。 select m.id, m.basyo, m.name, y.jyotai, y.time from main_tbl m left join ( select s.id, s.jyotai, s.time from sub_tbl s, ( select id, max(time) maxtime from sub_tbl group by id) x where s.id = x.id and s.time = x.maxtime) y on m.id = y.id ■考え方 1.sub_tblから、id毎に最大時間のデータを抽出したテーブルを作成し、xとする。 select id, max(time) maxtime from sub_tbl group by id 2.xとsub_tblを等価結合することでsub_tblからid毎に最大時間を持つ行を抽出したテーブルを作成し、yとする。 select s.id, s.jyotai, s.time from sub_tbl s , x where s.id = x.id and s.time = x.maxtime ※この手順は、最大時間を持つ行のjyotaiを取得するため。 3.main_tblとyを外部結合する。 select m.id, m.basyo, m.name, y.jyotai, y.time from main_tbl m left join y on m.id = y.id
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
こんなんでどうです? SELECT main_tbl.id, basyo,name,jyotai,time FROM main_tbl LEFT JOIN ( SELECT id,jyotai,time FROM sub_tbl WHERE (id,time) IN (SELECT id,max(time) from sub_tbl group by id) ) as x ON x.id=main_tbl.id
お礼
アドバイスありがとうございます。 一発で表示できました。 非常に洗練された構文ですね。 まだまだ勉強不足だと痛感しました。 また機会がありましたらご指導の程よろしくお願いいたします。
関連するQ&A
- LEFT JOINの条件式で=’’を使用した場合
以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、 なぜか上手く取得できません。 ご存知の方がいらっしゃいましたら、教えてください。 -- SQL1 --------------------------------------------------- select MAIN.MAIN_NAME, nvl(SUB1.CODE is NULL, 0) as SUB_CODE1, nvl(SUB2.CODE is NULL, 0) as SUB_CODE2 from MAIN_TABLE MAIN left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE and SUB1.ZYOUKEN = '1' (1) left join SUB_TABLE SUB2 on MAIN.CODE = SUB2.CODE and SUB2.ZYOUKEN = '' (2) where MAIN.CODE = 'XXX' ----------------------------------------------------------- 質問1. どうも、(2)の部分を空文字(?)ではなく何か値を入れると正常に1件 取得できるようなのですが、なぜ外部結合しているにもかかわらず 0件になってしまうのかが良く分かりません。 質問2. やはり条件に空文字を使用するのはよろしくないでしょうか? ※補足 念のため、以下のSQLを実行したところ、こちらは問題なく1件取得 できているので、抽出条件は間違っていないです。 -- SQL2 --------------------------------------------------- select MAIN.MAIN_NAME from MAIN_TABLE MAIN where MAIN.CODE = 'XXX' ----------------------------------------------------------- 以上です。宜しくお願いします。
- ベストアンサー
- Oracle
- 少し複雑な left join
まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。
- 締切済み
- MySQL
- LEFT JOINの使い方
linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。
- ベストアンサー
- MySQL
- PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。
以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php // データベースサーバへの接続・データベースの選択 $db = mysql_connect('localhost','test','password'); $db_name = 'test'; mysql_select_db($db_name,$db); // 処理対象テーブル $tbl_name1 = "client_master"; $tbl_name2 = "jobmaster0717"; // 内部結合(INNER JOIN句) $str_sql1 = "SELECT * FROM {$tbl_name1}" . " INNER JOIN {$tbl_name2}" . " ON {$tbl_name1}.company_ID" . " = {$tbl_name2}.client_ID;"; $rs1 = mysql_query($str_sql1,$db); print "\"{$str_sql1}\"<br>\n"; // 結果セットの表示 show_rs($rs1,$db); print "<br>\n"; // 結果セット(結果ID)の開放 mysql_free_result($rs1); // データベースサーバの切断 mysql_close($db); ?>
- 締切済み
- MySQL
- LEFT JOINが2つあるSQL文でANDの意味
■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a LEFT JOIN being b ON a.hoge_id = b.id LEFT JOIN call c ON c.call_id = a.hoge_id AND f.hoge_id = 12 WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?
- ベストアンサー
- MySQL
- LEFT OUTER JOIN でB表の制限付きで表示したいのですが
はじめまして。midwagonです。 SQLがわからないので教えてください。 A表:id,name B表:id,hiduke これを結合してA表にあるものをすべて表示したいのですが B表のhiduke="20080531" と 日付の制限をかけると何もかえってきません。 どうすればいいのか教えてください。 select A.id,A,name from A left outer join B on A.id=B.id where B.hiduke="20080531";
- ベストアンサー
- SQL Server
- LEFT JOIN について
table a ------ user_id ------ user1 user2 user3 user4 user5 ------ table b --------------- user_id role_id --------------- user1 role1 user2 role1 user3 role1 user2 role2 user4 role2 --------------- とします。 1つのSQL文で、a のすべてのユーザそれぞれが指定role_id に属しているかどうかを検索したいです。 例えば、すべてのユーザそれぞれが role1 に属しているかどうかを検索します。 欲しい結果は以下の通りです。 ------------ user1 true user2 true user3 true user4 false user5 false ------------ LEFT JOIN だと思いますが、うまくいきません。 SELECT a.user_id, b.role_id FROM a LEFT JOIN b ON a.user_id = b.user_id WHERE b.role_id='role1'; 結果は以下になります。 ------------ user1 role1 user2 role1 user3 role1 ------------ #Whereで絞って、当然の結果です SQLをどうかければよいでしょうか。 よろしくお願いします。
- ベストアンサー
- MySQL
- SQL LEFT JOIN
SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT * FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。
- ベストアンサー
- Oracle
- JOINのJOIN?
こんにちは。 本のデータベースを作っています。 ソート部分を作っています。 本の一覧から大分類でソートさせたいのですが、階層的なテーブルのJOINする方法が分かりません。 テーブルは下記のようになっています。 ---------------------------------------------------------------- DAI_BUNRUI_TBL(大分類) +-------+--------+ | D_ID |NAME| +====+====+ | 1 |D_N1| | 2 |D_N2| +-------+-------+ CHU_BUNRUI_TBL(中分類) +------+--------+--------+ | C_ID | D_ID |NAME| +====+====+====+ | 1 | 1 |C_N1| | 2 | 1 |C_N2| | 3 | 2 |C_N3| | 4 | 2 |C_N4| | 5 | 2 |C_N5| +-------+--------+-------+ HON_TBL(本のテーブル) +-------+--------+--------+ | H_ID | C_ID | NAME| +====+====+=====+ | 1 | 1 | Foo1| | 2 | 1 | Foo2| | 3 | 2 | Foo3| | 4 | 2 | Foo4| | 5 | 2 | Foo5| +-------+--------+--------+ ---------------------------------------------------------------- HON_TBLのC_IDとCHU_BUNRUI_TBLのC_IDをJOINTするには下記のようになると思いますが、 SELECT * FROM HON_TBL JOIN CHU_BUNRUI_TBL ON HON_TBL.C_ID = CHU_BUNRUI_TBL.C_ID ; さらにCHU_BUNRUI_TBLのD_IDとDAI_BUNRUI_TBLのD_IDを結合するにはどのようにするばよろしいのでしょうか?
- ベストアンサー
- MySQL
- left outer joinで抽出したい
SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。
- ベストアンサー
- MySQL
お礼
早速のアドバイスありがとうございます。 x,yに代入するという概念が自分の頭の中にありませんでした。 非常に丁寧な解説で初心者の私でも理解できました。 参考にさせて頂きます。また困った時はご指導よろしくお願いいたします。