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

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

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

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

SQL

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

Q&A

解決済

3回答

4004閲覧

mysqlのLIMIT句に関数の結果を使用したい

Koto_2131

総合スコア4

MySQL

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

SQL

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

0グッド

0クリップ

投稿2021/09/08 06:17

指定した期間の日次データを抽出しようとしています。
値が無かった日も表示したいことから、まず期間中の日数分の連番を作って、
値がある日にLEFT JOINしようと考えました。

抽出したい期間は毎回変わるため、まず期間中の行数分だけ連番のデータを作成しようとしたものが以下になります。

MySQL

1SELECT @seq_no := 0 AS seq_no 2UNION all 3SELECT @seq_no := @seq_no + 1 AS seq_no FROM information_schema.COLUMNS 4LIMIT( 5 SELECT DATEDIFF('2021-3-24','2021-2-19') 6)as Diff ;

2つの日付を入れると差を返してくるDATEDIFF関数を使用し、
LIMIT句で日数分繰り返しができると考えたのですが、
このLIMIT句の中で構文エラーが起きてしまいます。

SELECT DATEDIFF('2021-3-24','2021-2-19')

のみで実行すると、33と値が得られたため、
この値をLIMITで使えると思ったのですが認識が違ったようです。

実現するための方法をご教授願えませんでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

LIMITには数値しか指定できません
mysqlだけで完結したいならプロシージャなどで処理するしかないでしょう

sample

蛇足ながらprecedureでlimitを実行する

SQL

1/* 以下予め実行して作っておく */ 2drop procedure if exists sql_limit; 3delimiter // 4create procedure sql_limit(IN s varchar(200),IN l int) 5begin 6set @sql=concat(s,' LIMIT ',l); 7prepare stmt from @sql; 8execute stmt; 9end ; 10// 11delimiter ;

あとはlimitの値に式をいれる

SQL

1call sql_limit('select * from tbl',DATEDIFF('2021-3-24','2021-3-19') ); 2とか 3call sql_limit('select * from tbl',1+2 );

投稿2021/09/08 06:27

編集2021/09/08 08:28
yambejp

総合スコア116734

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

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

Koto_2131

2021/09/08 08:06

ありがとうございます。 そうだったのですね、ということはLIMIT句を動的に使用できないということでしょうか。 150くらいとって、期間でbetweenするとか、別な方法を検討してみます。
Koto_2131

2021/09/10 02:44

サンプルの追記ありがとうございます。 これはすごいですね、プリペアステートメントとかPHPだけじゃなくてSQLの中でも使えるんですね。 文字列として与えて展開させると実行できるんじゃ?っていうのは浮かんではいたんですけど実際のやり方が全然考えられなかったです。 新しい学びを得られました、ありがとうございます
guest

0

やりたいことはこういうことではないでしょうか?
MySQL8 より前のバージョンなら

sql

1SELECT 2 DATE_ADD('2021-2-19', INTERVAL @seq_no DAY) as date 3, @seq_no := @seq_no + 1 4FROM information_schema.COLUMNS 5 , (SELECT @seq_no := 0) as x -- 変数の初期 6WHERE @seq_no <= DATEDIFF('2021-3-24','2021-2-19')

投稿2021/09/08 11:25

takanaweb5

総合スコア359

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

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

0

やりたいことというのは、とどのつまり連続した日付を生成したいんですよね?

MySQL8以降であれば、再帰SQLを利用して連続した日付することができます。

SQL

1WITH RECURSIVE R (seq, yyyymmdd) AS ( 2 SELECT 1, DATE '2021-2-19' 3 UNION ALL 4 SELECT seq + 1, yyyymmdd + INTERVAL 1 DAY 5 FROM R 6 WHERE yyyymmdd < DATE '2021-3-24' 7) 8SELECT * FROM R;

投稿2021/09/08 08:30

編集2021/09/08 08:30
neko_the_shadow

総合スコア2349

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

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

Koto_2131

2021/09/09 08:36

ありがとうございます、まさにこんなことがやりたかったです! LIMITに固執しちゃっていましたが、先にシーケンスの初期値に日付を入れちゃえば 不等号で件数を制御できるんですね。 自分の年今日不足で再帰SQLが分からなくて、勉強しながら実装してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問