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

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

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

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

SQL

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

Q&A

解決済

4回答

1129閲覧

直近2日分のデータをMySQLで検索するSQL文について

masa158757571

総合スコア6

MySQL

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

SQL

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

0グッド

1クリップ

投稿2020/03/29 16:47

編集2020/03/29 17:38

テーブル
日にち  スキル 点数
2020-03-20 skill1 5
2020-03-20 skill2 3
2020-03-20 skill3 2
2020-03-15 skill1 1
2020-03-15 skill2 4
2020-03-15 skill3 2
2020-03-08 skill1 3
2020-03-08 skill2 2
2020-03-08 skill3 5


のとき直近2日分のデータ

日にち  スキル 点数
2020-03-20 skill1 5
2020-03-20 skill2 3
2020-03-20 skill3 2
2020-03-15 skill1 1
2020-03-15 skill2 4
2020-03-15 skill3 2

という検索結果を得たいです。
自分ではSQL文でどうしても過去分全てが表示されてしまいます。

SET

1SELECT * 2FROM ( 3SELECT * 4, IF(@id <> date.@c := 1, @c := @c + 1) c 5, IF(@id <> date, @id := date, @id := @id) i 6FROM TABLE_A 7ORDER BY date DESC, skill 8) a 9WHERE c <= 3; 10

MariaDB、mySQLです。
どうかご教示をお願いします。

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

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

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

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

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

javahack

2020/03/29 16:52

今のままだと丸投げになってしまうので、自分で作ったSQL文を質問を編集して記載してください。
masa158757571

2020/03/29 16:58

SET @id = '', @c = 0; SELECT * FROM ( SELECT * , IF(@id <> date.@c := 1, @c := @c + 1) c , IF(@id <> date, @id := date, @id := @id) i FROM TABLE_A ORDER BY date DESC, skill ) a WHERE c <= 3; です。よろしくお願いします。
javahack

2020/03/29 17:04 編集

ここではなく、質問文を修正した方が良いです。 その際、Markdownでコードを囲むとより良いです。 https://teratail.com/help#about-markdown あと、使用しているDBの種類、バージョン等の情報を追記すると回答が得られやすくなります。
m.ts10806

2020/03/29 21:21

テーブル定義(CREATE文)もご提示ください。
guest

回答4

0

ランク処理を応用すればこんな感じになります

投稿2020/03/30 00:44

yambejp

総合スコア115010

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

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

yambejp

2020/03/30 00:44

create table tbl (d date,skill int,point int); insert into tbl values ('2020-03-20',1,5), ('2020-03-20',2,3), ('2020-03-20',3,2), ('2020-03-15',1,1), ('2020-03-15',2,4), ('2020-03-15',3,2), ('2020-03-08',1,3), ('2020-03-08',2,2), ('2020-03-08',3,5);
yambejp

2020/03/30 00:45 編集

select * from tbl as t1 where (select count(distinct d)+1 from tbl where d>t1.d)<=2
masa158757571

2020/03/30 08:50

ランク処理というのもあるんですね。勉強不足でした。 ご回答ありがとうございました。
guest

0

ベストアンサー

サブクエリではLimitが使えないので

sql

1select * from テーブル t1 2where 日にち in ( 3 select 日にち from 4 (select distinct 日にち from テーブル order by 1 desc limit 2) t2 5);

投稿2020/03/29 23:09

amura

総合スコア333

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

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

hoshi-takanori

2020/03/29 23:34

そんなやり方があったとは…。
masa158757571

2020/03/30 08:49 編集

思っていたような処理ができました。 自分にはとても理解しやすかったです。 ご回答ありがとうございました。
guest

0

こんな感じでいかがでしょう。

テーブル定義

sql

1create table TABLE_A ( 2 date date, 3 skill varchar(255), 4 score int 5); 6 7insert into TABLE_A values ('2020-03-20', 'skill1', 5); 8insert into TABLE_A values ('2020-03-20', 'skill2', 3); 9insert into TABLE_A values ('2020-03-20', 'skill3', 2); 10insert into TABLE_A values ('2020-03-15', 'skill1', 1); 11insert into TABLE_A values ('2020-03-15', 'skill2', 4); 12insert into TABLE_A values ('2020-03-15', 'skill3', 2); 13insert into TABLE_A values ('2020-03-08', 'skill1', 3); 14insert into TABLE_A values ('2020-03-08', 'skill2', 2); 15insert into TABLE_A values ('2020-03-08', 'skill3', 5);

問い合わせ

sql

1select * from TABLE_A natural join 2(select distinct date from TABLE_A order by date desc limit 2) x 3order by date desc, skill;

実行結果

+------------+--------+-------+ | date | skill | score | +------------+--------+-------+ | 2020-03-20 | skill1 | 5 | | 2020-03-20 | skill2 | 3 | | 2020-03-20 | skill3 | 2 | | 2020-03-15 | skill1 | 1 | | 2020-03-15 | skill2 | 4 | | 2020-03-15 | skill3 | 2 | +------------+--------+-------+

投稿2020/03/29 19:00

hoshi-takanori

総合スコア7895

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

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

masa158757571

2020/03/30 08:50

思っていた処理ができました。 ご回答ありがとうございました。
guest

0

単純に

SQL

1SELECT * FROM テーブル 2WHERE 日にち >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) 3ORDER BY 日にち DESC, スキル

でどうでしょうか。

投稿2020/03/29 17:54

javahack

総合スコア1088

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

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

masa158757571

2020/03/30 08:55

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問