次のような2つのテーブルを考えます。
登録したメンバーの行動(何時にどこにいたか)を記録するものとお考えください。
テーブル:メンバー
番号,名前
1111,田中
2222,鈴木
3333,山田
テーブル:行動
番号,メンバー,場所,時間
0,1111,A社,12:00
1,1111,B社,13:00
2,1111,C社,14:00
3,2222,D社,11:30
4,2222,E社,12:00
5,2222,F社,15:00
6,3333,G社,12:30
7,3333,H社,13:30
8,3333,I社,14:30
行動テーブルの「メンバー」はメンバーテーブルの「番号」と関連付けられています。
さて、ここで田中さん、鈴木さん、山田さんの、最後に記録されたレコードを知りたいとします。
(例で言うと行動テーブルの2,5,8番を取り出すということです)
なるべくSQL文の実行を少なくするにはどうしたらいいでしょうか。
自分なりに考えたのですが、三人分繰り返すしか思いつきませんでした。。。
No.1ベストアンサー
- 回答日時:
セルフジョインでいけるかと。
SELECT * FROM 行動 a WHERE a.時間 = (SELECT MAX(b.時間 FROM 行動 b WHERE a.メンバー = b.メンバー GROUP BY b.メンバー)
この回答への補足
返事が遅くなりましてすいません。
上のSQL文ですと)が一つ足りないのですが、これはMAXを閉じ忘れているだけですよね。
このSQL文自体はうまくいかなかったのですが、
(phpMyAdminで実行するとSyntax Errorと表示されました)
一部を利用することで解決できました。
ありがとうございました。
No.3
- 回答日時:
SQLを考える場合は理論の構築が大切です。
先ず、「最後に記録されたレコード」とは何か?
「時間が最も大きい」ということですね。・・・(1)
SELECT メンバー,Max(時間) AS 最後 FROM 行動 GROUP BY メンバー
この最大値と同じ時間を持つレコードが目的のものです。・・・(2)
SELECT A.メンバー,A.場所,A.時間 FROM 行動 A
INNER JOIN (SELECT メンバー,Max(時間) AS 最後 FROM 行動
GROUP BY メンバー) B ON A.時間=B.最後
氏名が分からないので、メンバーと結合します。・・・(3)
SELECT A.メンバー,C.名前,A.場所,A.時間 FROM (行動 A
INNER JOIN (SELECT メンバー,Max(時間) AS 最後 FROM 行動
GROUP BY メンバー) B ON A.時間=B.最後)
INNER JOIN メンバー C ON A.メンバー=C.メンバー
即ち、1回のクエリで目的の情報は得られます。
SQLではプログラムのようにステップが無いので、
理論の構築とそれを表現するセンスが大切になります。
DBシステム、バージョンが記載されていないので、
結合式(JOIN句)の書式が一致しないかも知れません。
尚、Max関数はLast関数と異なり、殆ど全てのDBシステムで
サポートされています。
この回答への補足
詳しい解説、ありがとうございます。
No.1の方が投稿されてから、ひとまず自分で試行錯誤していたのですが、nda23と合っているようです。
結合のやり方は少し違いますが、1回のクエリで求める情報が得られるようになりました。
No.2
- 回答日時:
SELECT dbo_Table_test.name, Last(dbo_Table_test.address) AS addressの最後, Last(dbo_Table_test.hi) AS hiの最後
FROM dbo_Table_test
GROUP BY dbo_Table_test.name
ORDER BY dbo_Table_test.name;
のようにグループ化とLastを使ってはどうでしょう。
これはAccessの場合ですけど。あと並び変え順にも注意です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルリンク リンク元を知...
-
会社の飲み会の幹事になり、座...
-
L2SWはARPテーブルを持っている?
-
飲み会で、座敷orテーブルどち...
-
面接のときテーブルが正面に。...
-
下の画像はSQLの4大命令の性質...
-
外部キーだけのテーブル(主キ...
-
アクセスのリンクテーブル一覧...
-
MySQLで複数テーブルを作成する
-
ちょっとぐらいの時間なら里山...
-
テーブルの白く剥がれてるところに
-
2つのテーブルのカウント結果...
-
UTF8のテーブルをODBCドライバ...
-
[DB設計]多対多の問題点とは
-
【PHP】SQL文のSUM関数で出力し...
-
【SQL】グループ化した際の最頻...
-
「テーブルに座って……」という...
-
SQL 現在のレコードより古い番...
-
立体の重心の求め方について
-
複数テーブルにわたるCOUNT
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
会社の飲み会の幹事になり、座...
-
テーブルリンク リンク元を知...
-
L2SWはARPテーブルを持っている?
-
テーブルの白く剥がれてるところに
-
飲み会で、座敷orテーブルどち...
-
まるいテーブル 円い 丸い 漢字...
-
1つのテーブルに同じデータを参...
-
このテーブルで
-
置き配された食べ物を袋からど...
-
外部キーだけのテーブル(主キ...
-
【PHP】SQL文のSUM関数で出力し...
-
「テーブルに座って……」という...
-
男性と2人で飲食店に行きテーブ...
-
アクセスのリンクテーブル一覧...
-
一致するデータのみ削除したい
-
論理名とコメント構文(?)について
-
ACCESSで3ファイルを結合して、...
-
MySQLで複数テーブルを作成する
-
複数テーブルにわたるCOUNT
-
SQL 外部結合
おすすめ情報