
毎度お世話になります。
下記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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
GROUP BYを行った後に結合したい。
Oracle
-
2つのテーブルを結合して最大値を取得したい
SQL Server
-
単一グループのグループ関数ではありません。
Oracle
-
-
4
SELECT 文の NULL列は?
PostgreSQL
-
5
指定日付を起点にして最新日付のデータを取得
SQL Server
-
6
複数テーブルのMAX値の行データを取得したい
Oracle
-
7
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
8
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
9
Oracleで流したSQLのログを取得できますか?
Oracle
-
10
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
11
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
12
SELECTの結果で同一行を複数回出力する
Oracle
-
13
SELECT 文 GROUP での1件目を取得
SQL Server
-
14
キー毎の、ある列のmaxのレコードを取得し、別の列の値を取得したい
SQL Server
-
15
SQLにて指定日付より前、かつ最新のデータを1件取得したいです。
PostgreSQL
-
16
Excelに、ダブルクォーテーションで始まる文字列を貼り付けると、ダブルクォーテーションが消えること
Excel(エクセル)
-
17
MAX値を条件にデータを取得するには?
SQL Server
-
18
SQL、2つのテーブルで条件一致したものだけdeleteする方法は?
Oracle
-
19
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
20
yyyymmddからyyyy/mm/ddへの変換
Java
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
[急ぎ] videoタグで埋め込んだm...
-
バッチファイルでカウントアッ...
-
【HP作成】クリックすると下...
-
初期状態でテーブルの非表示
-
jQueryでクリックされた要素のi...
-
取得した要素がインライン要素...
-
【jQuery】2分割レイアウトで、...
-
jqueryのsortableで一部ソート...
-
iframe内のリンク文字のマウス...
-
jQueryで特定のURLの時のみ表示
-
重なった画像にクリックイベン...
-
libjpegライブラリの使い方につ...
-
textareaに画像を表示したい
-
MFCで画像を表示させているので...
-
c++std::string型をTCHARに変換...
-
ボタンをクリックすると、隣の...
-
Slick.jsのオプションrtlについて
-
window.openで値の渡し方を教え...
-
FireFoxのjavascriptでonloadで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
createElementで作成した要素を...
-
変数名をどのようにつけるのが...
-
読み込んだQRコードをフォーム...
-
【HP作成】クリックすると下...
-
removeEventListenerについて
-
iframe内のリンクが飛ばないの...
-
[急ぎ] videoタグで埋め込んだm...
-
HTMLタグに複数のクラスを設定...
-
指定したパスが現URLに含まれて...
-
HTMLとJavaScriptで作ったタイ...
-
バッチファイルでカウントアッ...
-
Gif画像のアニメーションが再生...
-
背景色を一定時間ごとにランダ...
-
401エラードキュメントを401.ht...
-
クリックで表示される領域を分...
-
jQuery の jqPlotプラグイン
-
[JavaScript]IE11にてフリック...
-
getElementByIdの戻り値がnull...
おすすめ情報