質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

5735閲覧

【MySQL】同一グループの中で最大の1レコードを取得する

Honma

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/06/24 03:02

MySQLについてです。

+----+----------+------------+
| id | custo_id | updated_at |
+----+----------+------------+
| 1 | 1 | 2016-06-07 |
| 2 | 2 | 2016-06-06 |
| 3 | 1 | 2016-06-02 |
| 4 | 2 | 2016-05-30 |
| 5 | 2 | 2016-05-24 |
+----+----------+------------+

上記のようなテーブルに対して、
・updated_atが2016-06-05より古い日付かつ、その中で一番最新の日付の値を持つレコード
・1種類のcusto_idにつき1レコードのみ取得する
という条件でデータ取得を行えるようなSQL文をご回答いただけますでしょうか。
上記のテーブルにおいてはid3と4の2レコードが取得されるのが期待値となります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずcusto_idごとにグルーピングしたテーブルの各custo_idごとの最大の日付を求め、それを使ってテーブル全体からcusto_idと最大の日付が一致するレコードを取るという手法になります。

SQL

1SELECT 2 * 3FROM 4 xxxxx 5WHERE 6 (custo_id, updated_at) IN (SELECT 7 custo_id, 8 MAX(updated_at) 9 FROM 10 xxxxx 11 WHERE 12 updated_at < "2016-06-05" 13 GROUP BY 14 custo_id 15 );

投稿2016/06/24 03:20

編集2016/06/24 03:32
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Honma

2016/06/24 04:07

迅速な回答ありがとうございました!
kaz.Suenaga

2016/06/24 04:11

おじゃまします。 これ、同じcusto_id で updated_at が同じ日付のデータが含まれた時点で問題が起こりますよね。 もう1つ条件(その場合はidの最大、等)が必要になるはずなので、そういったことが想定できるのであればお気を付けください。
KiyoshiMotoki

2016/06/24 04:31

横から失礼します。 kaz.Suenaga様 > 同じcusto_id で updated_at が同じ日付のデータが含まれた時点で問題が起こりますよね。 ご指摘ありがとうございます。 私の回答も同様ですね。 ただ、単に両方のデータが取得されるだけなので、 それが問題かどうかは、質問者様の意図しだいかと思います。
kaz.Suenaga

2016/06/24 04:36

そうですね。 一般的にはもしこのままの状態でidを取った場合、それをさらに何かに紐づけるような使い方が想定できるので、想定の動作をしないことがあり得ますよ、という意味での余談でした。 おっしゃるとおり、意図・要件次第ですね。
guest

0

ベストアンサー

sql

1SELECT 【テーブル名】.* 2FROM 【テーブル名】 3 INNER JOIN ( 4 SELECT custo_id, MAX(updated_at) updated_at 5 FROM 【テーブル名】 6 WHERE updated_at < '2016-06-05' 7 GROUP BY custo_id 8 ) AS tmp ON 【テーブル名】.custo_id = tmp.custo_id AND 【テーブル名】.updated_at = tmp.updated_at;

http://sqlfiddle.com/#!9/e3a37/7

投稿2016/06/24 03:24

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Honma

2016/06/24 04:08

迅速な回答ありがとうございました! 実際に動いているサンプルもつけてくださってわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問