よく書くけど毎回ググってる気がするMySQLのクエリーメモ

前日から直近30日のデータを抽出

カラムがdatetime(時分秒持ってる)のとき

WHERE
DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY) <= updated_at
AND updated_at < CURRENT_DATE
  • CURRENT_DATE は当日のdate(YYYY-MM-DD) を取得する関数
  • dateとdatetimeの比較メモ
    • 2021-07-20 23:59:59 < 2021-07-21
    • 2021-07-20 <= 2021-07-20 00:00:00

先月1ヶ月分のデータを抽出

前々月の1日 <= データ < 前月の1日 で取得してあげる

WHERE
updated_at >= DATE_FORMAT(ADDDATE(CURDATE(), INTERVAL -1 MONTH), '%Y-%m-01'))
AND updated_at < DATE_FORMAT(CURDATE(), '%Y-%m-01')

列名に変数を使いたい(列名に現在日を表示したい)

こんなことしたい。

name 2021-09-13_count
hoge 1
fuga 100

PREPARE構文使わないとできない?もっと簡単にできる方法あれば知りたい。。。

SET @DATE=curdate();
set @query = concat('select 1 as `', @DATE, '_count`;');
prepare stmt from @query;
execute stmt;

重複が多いデータを調べる

SELECT count(*),column_name
FROM table_name
where column_name is not null
GROUP BY column_name
HAVING count(*)>1
ORDER BY count(*) DESC

文字数が長いデータを調べる

SELECT *,CHAR_LENGTH(column_name) as STR_LEN FROM table_name ORDER BY STR_LEN DESC;