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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

620閲覧

mySQLの履歴テーブルからのデータ取得について

nakashima

総合スコア0

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2020/07/03 09:31

編集2020/07/03 10:07

実現したいこと/不明点

「投稿テーブル」と「ユーザーテーブル(履歴)」があり、投稿日時点でのユーザー情報を取得したい。
最新データの取得であればmax関数を使えばできるということはわかっていますが、投稿日時点の履歴をどのように引っ張ってこればよいかわからない状態です。

テーブル情報

投稿テーブル

id|user_id|created 1 |A |20200621 2 |A |20200505 3 |B |20200520 3 |B |20200608

ユーザー履歴テーブル

user_id|rank|created A |1 |20200503 A |1 |20200601 A |3 |20200615 A |2 |20200701 B |2 |20200516 B |1 |20200601 B |3 |20200607 B |5 |20200701

ほしい結果

id|user_id|rank|投稿created 1 |A |3 |20200621 2 |A |1 |20200505 3 |B |2 |20200520 3 |B |3 |20200608

補足情報(FW/ツールのバージョンなど)

どのようにQueryを記載すればよいかご教授いただけますと幸いです

Orlofsky👍を押しています

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

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

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

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

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

aokikenichi

2020/07/03 09:42

「投稿日時点の履歴」とな何でしょうか 投稿テーブルとユーザー履歴テーブルの created はどう違いますか A 3 20200615 → 20200621 A 1 20200601 → 20200505 の関係性が分かりません。
m.ts10806

2020/07/03 10:08

テーブル定義を提示してください(CREATE TABLE文で)
nakashima

2020/07/03 10:13

投稿テーブルのcreatedはユーザーがある情報を投稿した日時になります。 ユーザー履歴テーブルのcreatedはユーザー情報に追加があった日時になります。 今回取得したい情報は、ユーザーがある情報を投稿した日時時点でのユーザー情報(rank)を取得したいです
guest

回答2

0

テーブル定義はyambejp氏のを拝借。ありがとナス。本当は質問者さんに用意してほしい…

本題、rankだけでいいなら

sql

1select t1.id,t1.user_id 2 ,(select t3.rank 3 from rireki t3 4 where t3.user_id=t1.user_id 5 and t3.created < t1.created 6 order by t3.created desc 7 limit 1) rank 8 ,t1.created 投稿created 9from toukou t1

こう。

rirekiテーブルのなにがしかもほしいなら無理やり一発で

sql

1select t1.id,t1.user_id,t2.rank,t1.created 投稿created,t2.created t2_created 2from toukou t1 3 inner join rireki t2 on t2.user_id = t1.user_id 4 and t2.created = (select t3.created 5 from rireki t3 6 where t3.user_id=t1.user_id 7 and t3.created < t1.created 8 order by t3.created desc 9 limit 1) 10order by id 11

こう。

投稿2020/07/03 13:13

sousuke

総合スコア3828

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

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

0

Aは20200505時点、Bは20200520時点で履歴がないので
「ほしい結果」を導くことはできません

投稿2020/07/03 09:59

yambejp

総合スコア114814

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

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

nakashima

2020/07/03 10:08

ご指摘ありがとございます。データを修正いたしました。
yambejp

2020/07/03 11:20

ちょっと冗長ですが・・・ create table toukou(id int,user_id varchar(10),created date); insert into toukou values (1,'A','20200621'), (2,'A','20200505'), (3,'B','20200520'), (3,'B','20200608'); create table rireki (user_id varchar(10),rank int,created date,unique user_id_created(user_id,created)); insert into rireki values ('A',1,'20200503'), ('A',1,'20200601'), ('A',3,'20200615'), ('A',2,'20200701'), ('B',2,'20200516'), ('B',1,'20200601'), ('B',3,'20200607'), ('B',5,'20200701');
yambejp

2020/07/03 11:20

select min(t1.id) as id, t1.user_id, t1.created as t1_created, max(t2.created) as t2_created, (select rank from rireki where user_id=t1.user_id and created=max(t2.created)) as rank from toukou as t1 inner join rireki t2 on t1.user_id=t2.user_id and t1.created>=t2.created group by user_id,t1_created order by id,rank
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問