はい!今やってます!

Work Pertly, Live Idly

SQL

「連続〇〇日〇〇しました」みたいなStreakを計算したいときのSQLをMySQLで

Streakを計算したいときに思い出すSQL。 SELECT MAX(streak) AS streak FROM ( SELECT tmp1.*, IF( @prev + INTERVAL 1 DAY = tmp1.date, @streak := @streak + 1, @streak := 1 ) AS streak, @prev := tmp1.date FROM ( SELECT date FROM logs WHERE user_i…

GormのPreload時のstatusチェックの挙動

GormのSQLでPreloadを利用する場合、各モデルと紐付けるタイミングで条件を指定したくなる場合がある。 Preloadに条件指定する場合に、上手く実行されるケースとされないケースがある。 こちらは正しくすべてのテーブルでstatusが指定される。 func (questio…

Duplicateエラーが出る場合の対処法

MySQLでKey Duplicateのエラーが出る場合、 INSERT ... ON DUPLICATE KEY UPDATE の構文を使えば解消出来る場合がある。 INSERT INTO ${table_name} (a, b, c) VALUES (1, 12, 123) ON DUPLICATE KEY UPDATE b = 22, c = 223; 参考 https://dev.mysql.com/do…

直前に投げたSQLの結果件数を取得するSQL

Limit句に関係無く、検索対象の全件数を返してくれる。 SELECT SQL_CALC_FOUND_ROWS * FROM ${table_name} LIMIT ${limit_count}; SELECT FOUND_ROWS(); 全〇〇件中 とか表示したい時に便利

メールアドレスのドメイン部分を一括で置換するSQL

メールアドレスのドメイン部分を一括で置換する UPDATE `test_user` SET `email` = CONCAT( LEFT( `email`, INSTR(`email`, '@') ), 'test.com' ) WHERE `email` NOT LIKE '%@test.com';