毎度お世話になります。
下記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
です。
まだまだ勉強中ですのでよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
もう少しすっきりした文になるかも知れませんが、とりあえず以下の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
早速のアドバイスありがとうございます。
x,yに代入するという概念が自分の頭の中にありませんでした。
非常に丁寧な解説で初心者の私でも理解できました。
参考にさせて頂きます。また困った時はご指導よろしくお願いいたします。
No.2
- 回答日時:
こんなんでどうです?
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
【お題】 ・西暦2100年の「小学生のなりたい職業ランキング」で1位になった職業は何か教えてください
-
2つのテーブルを結合して最大値を取得したい
SQL Server
-
GROUP BYを行った後に結合したい。
Oracle
-
MAX値を条件にデータを取得するには?
SQL Server
-
-
4
複数テーブルのMAX値の行データを取得したい
Oracle
-
5
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
6
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
7
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
8
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
9
カーソル0件の時にエラーを発生させる
Oracle
-
10
SQL Left Join で重複を排除するには
SQL Server
-
11
INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい
その他(データベース)
-
12
単一グループのグループ関数ではありません。
Oracle
-
13
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
14
<SQL>重複しているデータの場合は最新の日時のものを取得したい
SQL Server
-
15
CASE文のエラーについて
Oracle
-
16
Oracleでの文字列連結サイズの上限
Oracle
-
17
ストアドプロシジャからストアドプロシジャを呼ぶには?
Oracle
-
18
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
19
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
20
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・遅刻の「言い訳」選手権
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
onclickとonmouseoverを同時に...
-
背景色を透明化
-
removeAttribute()メソッドで削...
-
リンク色を動的に変更したい。i...
-
Gif画像のアニメーションが再生...
-
[JS] あるクラス名をページから...
-
アンケートサイトを作りたい!...
-
jQueryの画像を使用したタブメ...
-
クリックで色変更後に既に変更...
-
JavascriptでDIV~DIVをリロードで
-
jQueryで同じid属性が複数あっ...
-
console.log結果をhtmlで表示し...
-
複数のリンク画像を一定時間で...
-
指定したパスが現URLに含まれて...
-
初期状態でテーブルの非表示
-
JSで動的にリンクを作成
-
iframe内のリンクが飛ばないの...
-
createElementで作成した要素を...
-
javascriptテキストBOX色を元に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
createElementで作成した要素を...
-
表示・非表示のスクリプトで、...
-
iframe内のリンクが飛ばないの...
-
背景色を透明化
-
IFRAMEの表示/非表示を切り替え...
-
removeEventListenerについて
-
クリックで色変更後に既に変更...
-
removeAttribute()メソッドで削...
-
VBScript+IEのチェックボック...
-
折りたたみ部分にアンカーでリ...
-
【HP作成】クリックすると下...
-
テキストボックスに入力された...
-
getElementByIdの戻り値がnull...
-
Javascriptで現在のページ番号...
-
タブで開いてさらにタブ内をア...
-
jQueryで同じid属性が複数あっ...
-
指定したパスが現URLに含まれて...
-
jqueryを使って無駄なspanタグ...
おすすめ情報