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

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

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

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

Q&A

解決済

1回答

6466閲覧

mysql 一分毎に値を取得する group by 条件文の解説をお願いします

blossan

総合スコア154

MySQL

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

0グッド

0クリップ

投稿2016/11/07 02:33

御世話になります。
あるsqlの where ,group by の条件文の解説をお願いしたいと思います。
条件の意味として、whereの範囲で、group by でまとめた(今回は一分毎に)値を抽出することは確認しましたが、条件文の関数の理解にてこずっています。
よろしくお願いします。

sql

1$history_limit = 60 * 60;

sql

1WHERE 2(UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(A.created) < ({$history_limit}))

sql

1GROUP BY 2FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(テーブル名.created) / 60, 0) * 60) 3 ")

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

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

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

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

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

guest

回答1

0

ベストアンサー

UNIXTIMEは、1970/01/01 09:00:00から始まる通し秒数です。
UNIX_TIMESTAMPは、DATETIMEからこの通し番号に変換します。
逆にFROM_UNIXTIMEは、この通し番号からDATETIMEの値に変換します。

を前提にして考えて

WHERE
(UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(A.created) < ({$history_limit}))

は、今からnow()とA.createdを通し秒に変換してからの引き算が3600秒(1時間)よりも小さいものを
抽出対象とします、1時間以内となります。

GROUP BY
FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(テーブル名.created) / 60, 0) * 60))

では、UNIX_TIMESTAMP(テーブル名.created)にてUNIX通し秒を60で割り、これを
TRUNCATE(0指定で少数点以下の切捨て)して60を掛ける事で分数単位の値に揃える
事になります。
この結果をFROM_UNIXTIMEにてDATETIMEに変換してこれをGROUPBYの単位としています。

投稿2016/11/07 03:20

編集2016/11/07 03:39
A.Ichi

総合スコア4070

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

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

blossan

2016/11/07 03:59

解説を頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問