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

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

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

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

Q&A

解決済

1回答

1301閲覧

ダミーテーブルの件数が正しく出力されない

cupnew1988

総合スコア20

MySQL

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

0グッド

1クリップ

投稿2023/03/13 01:12

編集2023/03/14 16:07

一定間隔のダミーテーブルを出力する SELECT文の出力件数が実行ユーザーによって異なります。

SELECT * FROM ( SELECT @dt := '2023-03-09 00:00:00' AS start, @dt +interval (60 - 1) second AS end UNION SELECT @dt := @dt + interval 60 second, @dt +interval (60 - 1) second AS start FROM information_schema.COLUMNS WHERE @dt <= '2023-03-10 00:00:00' ) AS T mysql> show grants for user001@localhost; +-----------------------------------------------------------------------------------------+ | Grants for user001@localhost | +-----------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `user001`@`localhost` | | GRANT SELECT ON `table001`.* TO `user001`@`localhost` | | GRANT SELECT, INSERT, UPDATE, DELETE ON `table001`.`user_list` TO `user001`@`localhost` | +-----------------------------------------------------------------------------------------+

・ルートユーザーの場合:1442件(正解)
・user001の場合:801件(足らない)

■追加
その後、確認のためルートユーザーでも日時を広げると正しく出力されませんでした。
WHERE @dt <= '2023-03-20 00:00:00'
件数:3601件(15,842件くらいになるはず)

この時の「SHOW WARNINGS」は以下でした。

mysql> SHOW WARNINGS; +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. | | Warning | 1287 | Setting user variables within expressions is deprecated and will be removed in a future release. Consider alternatives: 'SET variable=expression, ...', or 'SELECT expression(s) INTO variables(s)'. | +---------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

問題になるような警告は出て無いようです。
このSELECT文のダミーテーブルでは多くの件数を作成できないのでしょうか??

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

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

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

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

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

yambejp

2023/03/13 01:57

まずは「SHOW WARNINGS」で確認してみてください
YakumoSaki

2023/03/13 15:47

hoshi-takanori さんの記述は完璧な回答だと思うので回答欄に書いたほうが良いと思います。
cupnew1988

2023/03/14 00:15 編集

返答が遅くなりました。 質問に追加で示したように、rootで実行しても一定数以上のカラムは出力されません。 変数だけで出力するダミーテーブルですが、 これも何らかのアクセス権が影響している、ということでしょうか。
guest

回答1

0

ベストアンサー

ご質問のSQLを見ると、FROM information_schema.COLUMNS を行っているのでDB上に存在しているカラム一覧の件数までしか行を出力できないように見えます。
rootユーザーとそれ以外で件数が異なってしまった件もこれで説明がつきます。

とりあえず以下のようなSQLで問題ないように見える出力が得られました。
ご参考になれば幸いです。

MySQL 5.7 で動作確認しました。

sql

1SELECT count(*) FROM 2 ( SELECT @dt := '2023-03-09 00:00:00' AS start, 3 @dt +interval (60 - 1) second AS end 4 UNION 5 SELECT @dt := @dt + interval 60 second, 6 @dt +interval (60 - 1) second AS start 7 FROM 8 ( 9 SELECT @row := @row + 1 AS row FROM 10 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, 11 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, 12 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, 13 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, 14 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t5, 15 (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t6, 16 (SELECT @row:=0) numbers 17 ) NUMTBL 18 WHERE @dt <= '2023-03-20 00:00:00' 19 ) AS T 20;

大量の行数の生成は以下を参考にしました。
https://stackoverflow.com/questions/304461/generate-an-integer-sequence-in-mysql

投稿2023/03/14 02:49

YakumoSaki

総合スコア2027

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

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

cupnew1988

2023/03/14 04:28 編集

回答、ありがとうございます! 早速そのままを試してみましたが(MySQL 8.0 です) ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'row FROM (select 0 union all select 1 union all select 2 union all selec' at line 9 となります。 環境によってなにか差異は考えられますか?
cupnew1988

2023/03/14 04:49 編集

変数 "row" を "rowno" に変更すればできました。(rowは予約語?) 内部演算の桁数が増えると少し応答が遅いです。 (select 0 union all ... select 9) t, の繰り返し回数が10のn乗ですね。 出力カラム数は5桁:100,000行で十分なので、t1 ~ t5 で対応しました。 ありがとうございました!!
YakumoSaki

2023/03/14 05:52

遅い件も本当にそのとおりの理屈です。8.0であればWITH句を使えるのでもう少しスマートにできるかもしれません。何にせよ、お役に立ててよかったです。
cupnew1988

2023/03/14 07:07

他の方の情報を参考にWITH句でも試しました。 cte_max_recursion_depth値がデフォルトで1000なので、最大値を変更すると出力できました。 set @@session.cte_max_recursion_depth = 100000; WITH RECURSIVE nrows(date) AS ( SELECT '2023-03-09 00:00:00' UNION ALL SELECT DATE_ADD(date,INTERVAL 60 SECOND) FROM nrows WHERE date<='2023-03-10 00:00:00') SELECT date AS start, DATE_ADD(date,INTERVAL 59 SECOND) AS end FROM nrows; 8.0ではこちらのほうが高速ですね。 以上、皆さんありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問