20190711のMySQLに関する記事は6件です。

UdemyのPHP+MySQL(Byたにぐちまこと)をまとめてみた

はじめに

Udemyの講座を受けながら、まとめた自分なりのアウトプットです!

同じ講座を受ける際には参考にしてみてください!!!!!!

セクション1はセットアップのため飛ばして、2からになっています。

セクション2:PHPの基本を学ぼう

・HTMLタグのname属性がformタグで送信する際の、識別子になる

・inputタグは閉じタグが必要ない=単独タグ

・input type = submitタグのvalueタグはボタンの表面に表示する文字列

・htmlspecialchars($REQUEST[my_name],ENT_QUOTES)
 →$_REQUESTmy_nameをENT_QUOTESの型にエスケープさせるメソッド
 ※特殊な場合以外は基本的にENT
QUOTES

・$_REQUESTはPOSTでもGETでもどちらでも受け取ることができる
 →GETかPOSTどちらが受け取れてるのかわからないため、基本的にわかっている場合は指定したほうがいい

・ラジオボタンはvalue属性が送信される(textfieldも一緒でvalue属性を送っている)
 フォームで送られるものはvalue属性に設定されているものが送信される
 チェックボックス、セレクトタグ、etc

・チェックボックスで複数の値を送信する場合はname属性にブレケッツ[]をつける必要がある
 →配列の形式で送信されるため
 →そのため受け取る時は配列で受け取り、foreach($_POST['reserve'] as $reserve)などで取り出す!

・変数はその画面で終わる
 セッションは画面間を移動してもブラウザを閉じるまでは保存されている
 (サーバーにsession IDが保存されていて
 、ブラウザ側のクッキーにsession IDを持たせてそれと付き合わせて照合する)
 クッキーは画面を閉じても有効期限までは保存されている(ブラウザ側に保存 パスワード等は入れちゃダメ!)
 →保存期間がそれぞれ違うから区別して使う!

セクション3 データベースの基本を学ぼう

・UPDATEとDELETEのSQLはWHERE句で指定しないと全ての値が対象になるから気をつけて実行する必要がある

・PHPMyadminでは主キーの設定が上手くいかないことがある
→SQLで実行する!

・PHPMyadminはもともと英語のシステムを日本語で割り当ててるから文法とかおかしいのがたまにある
ex)カラムの追加

・主キーは一意の値のカラムになる(idとか)

・AUTO_INCREAMENTした状態で何か値を削除したらそこの採番は永久欠番になる

・基本DBで一度削除した値と同じ採番は実装しない!

・WHEREのあいまい検索はLIKE %~% で行う

・TIMESTAMPという型はデータの変更時間を自動的に入れてくれる

・LEFT JOIN 
 SELECT item_name,SUM(COUNT) FROM my_items LEFT JOIN carts ON my_item.id=carts.item_id GROUP BY carts.item_id

 my_itemsに属する形でcartsに結合させるからcartsにないものもmy_itemsにあればそれに紐づいて表示される
 ON以降にテーブルを繋げる条件を記述

・DISTICNTで値を重複させず取得できる

・BETWEEN 50 AND 149
 でWHERE price > 50 AND price < 150と同じ

・WHERE id IN(1,3)
複数の条件を記述できる

・LIMIT 2,3(2個目から3つ取得)
第一パラメータがどこから第二パラメータで何件かを取得するという記述

・半角空白を書くとそのテーブル名などのオブジェクトをエイリアスで記述できる
 SELECT item_name,SUM(COUNT) FROM my_items i LEFT JOIN
carts ON i .id=carts.item_id GROUP BY carts.item_id

・SQLが集まったものとしてエクスポートでバックアップを取れる

・復元はDBを作成したあとにインポートでバックアップしたSQLを取り込む

セクション4: PHP+MySQL(MariaDB)を組み合わせて、Webシステムを作ろう

・$db = new PDO('mysql:dbname=mydb;host=127.0.0.1';charset=utf8,'root','root');
でアクセス host=127.0.0.1は自分自身を表すIPアドレス

・exec()メソッドは影響を与えた行の数を返す
 query()メソッドはSQLの結果の値を返す
execute()メソッドはプリペアードステートメントを実行する

・queryはオブジェクトなのでそこから値を取得するにはfetch()する
 $record = $records -> fetch();の$recordは連想配列になっている

・$statement = $db->prepare('INSERT INTO memos SET memo = ?,created_at = NOW()');
$statement -> execute(array($_POST['memo'])));
で?の部分にexecuteで値を入れる

・bindparamで複数の?にSQLを代入できる

・Session以外で次のページに値を受け渡す方法として、
 inputタグのhidden属性を使ってPOSTでそのvalueを渡してやるといった方法もある

・PHPではCRUDはデータベースに直接SQLを発行して行う

セクション5: 「Twitter風ひとこと掲示板」を作成しよう

・varchar型は文字数を制限したtext型のこと

・header('Location:check.php')でcheck.phpにリダイレクトできる
 その後路にはexitが必要

・formタグでファイルをアップロードする場合は

が決まり文句

・$image = date('YmdHis'). $_FILES['image']['name'];
でファイル名がアップロードされた時に日付を付加してファイル名が重複するのを防ぐ

・ move_uploaded_file($FILE['image']['tmp_name'],'../member_picture/' . $image);
$_FILEがinput type = fileであげたものが入っているグローバル変数
['image']['tmp_name']は一時的に上がっている場所
move
uploaded_file(ファイル、ファイルの移動先../member_picture/' . $image)

・substr($fileName, -3)でファイルの拡張子を得る(後ろから3文字を切り取る)

・セッションは使い終わったらすぐに破棄するようにする
unset($_SESSION['join']);

・textareaのformパーツはvalueタグがなく、その代わりにに囲まれた部分がvalueになる

最後に

Evernoteにまとめたやつを貼り付けただけなので、こっちが元になっています
見づらかったら以下を参考にしてください!
https://www.evernote.com/shard/s625/sh/d81568ef-475c-4c15-b3c6-ae9da198f15c/0573994a5c161bb9cbdb23f85cd37ba9

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6 のちょい足しな新機能を試す51(MySQL default編)

はじめに

Rails 6 に追加されそうな新機能を試す第51段。 今回は、 MySQL default 編です。
Rails 6 では、 MySQL 8.0.13 以降のデータベースの場合に マイグレーションのカラムを追加するときに default オプションで式を指定できるようになりました。
言い換えると、MySQL 8.0.13 以降で カラムの default に式が使えるようになったことに、Rails が対応したということになります。

Ruby 2.6.3, Rails 6.0.0.rc1, MySQL 8.0.16 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease でインストールできます。

$ rails --version
Rails 6.0.0.rc1

今回は、IPアドレスをソートして表示する機能を作ってみたいと思います。

rails プロジェクトを作る

$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1

scaffold で CRUD の機能を作る

scaffold で Host の CRUD を作成します。
カラム aton は、IPアドレスを数値に変換した値を保存します。

$ bin/rails g scaffold Host ip aton:integer

migration ファイルを編集する

migration ファイルを編集します。

ip カラムに null: false を指定します。
aton のデフォルト値は、MySQL の関数 INET_ATON() を使って ip のカラムを変換した値にします。
atonlimit: 5 を指定しているのは、 255.255.255 を数値に変換した時に正しい値が保存されるようにするためです。

db/migrate/20190706063437_create_hosts.rb
class CreateHosts < ActiveRecord::Migration[6.0]
  def change
    create_table :hosts do |t|
      t.string :ip, null: false
      t.integer :aton, limit: 5, default: -> { '(inet_aton(ip))' }

      t.timestamps
    end
  end
end

HostController#index を変更する

IPアドレスをソートして表示するために、 order を追加します。
ソートのキーは aton にします。

app/controllers/hosts_controller.rb
class HostsController < ApplicationController
  ...
  def index
    @hosts = Host.all.order(:aton)
  end
  ...
end

seed データを作る

1件ずつブラウザでデータを登録するのは面倒なので、seed データを作っておきます。

db/seeds.rb
Host.create(
  [
    { ip: '192.168.1.1' },
    { ip: '192.168.2.1' },
    { ip: '192.168.9.1' },
    { ip: '192.168.10.1' },
    { ip: '192.168.20.1' },
    { ip: '192.168.99.1' },
    { ip: '192.168.120.1' }
  ]
)

データベースを作る

データベースを作って seed データを登録します。

$ bin/rails db:create db:migrate db:seed

rails server を実行して Host の一覧を表示する

rails server を実行します。

$ bin/rails s

http://localhost:3000/hosts で一覧画面を表示します。
IPアドレスの順番にソートされています。
host_order_by_aton.png

ちなみに order:ip を指定すると文字列としてソートされてしまいます。
host_order_by_ip.png

その他

ツッコミどころの多いソースかも知れませんが、今回は、あくまで default で式が使えることを確認する目的ですので見逃してください。
あと、今回は試してませんが、インデックスでも式を使うことができるようになっています。

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try051_mysql_default_expression

参考情報

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLの初期パスワードが/var/log/mysqld.logに出力されないときの対応(CentOS7 + MySQL8.0におけるパスワードリセット)

AzureのCentOS7.5にMySQL8.0をインストールした際、/var/log/mysqld.logに初期パスワードが出力されなかったので(パーミッションの問題?)、その際の対応をメモ。

結論

  • パスワードをリセットするしかない

やり方

とりあえずmysqldを停止させる。

sudo systemctl stop mysqld

mysqldをセーフモード?で起動させる。
CentOS7環境ではmysqld_safeコマンドは使えないみたいなので環境変数で起動オプションを設定。

sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"

mysqldを起動させる。

sudo systemctl start mysqld &

コンソールが戻ってくるよう&をつけている。

rootでログイン

mysql -u root

パスワードを一度nullでリセット。

use mysql;
UPDATE mysql.user SET authentication_string=null WHERE User='root';

一応反映。

FLUSH PRIVILEGES;

mysqlを抜けて、mysqldを停止させる。

sudo systemctl stop mysqld

環境変数をリセット。

sudo systemctl unset-environment MYSQLD_OPTS

mysqldを起動。

systemctl start mysqld

パスワード無しで入れることを確認。

sudo mysql -u root -p

あとは、初期状態ならmysql_secure_installation等でパスワードを設定するか、

mysql_secure_installation

Alterでパスワードを変更する。

ALTER USER 'root'@'localhost' identified BY 'hogehoge';

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MariaDB (MySQL) の select 時に等間隔で間引く

前提

  • insert_on に insert 時のタイムスタンプが入っている (他にもカラムはあるが省略)
  • "select * from atable;" で全て持ってきた上でスクリプト側で処理していたが、(VPS スペックが負けるようになったのか) スクリプトが OOM Killer の標的になり始めたので、select 時点で間引いておきたい
  • レコードは基本的に 10 分毎
    • なので、20 分毎, 40 分毎といったような間隔でレコード情報を取得したい
MariaDB [adb]> select id,insert_on from atable limit 10;
+----+---------------------+
| id | insert_on           |
+----+---------------------+
|  1 | 2011-08-12 19:49:24 |
|  2 | 2011-08-12 19:51:04 |
|  3 | 2011-08-12 20:01:04 |
|  4 | 2011-08-12 20:11:06 |
|  5 | 2011-08-12 20:21:08 |
|  6 | 2011-08-12 20:31:06 |
|  7 | 2011-08-12 20:41:04 |
|  8 | 2011-08-12 20:51:06 |
|  9 | 2011-08-12 21:01:04 |
| 10 | 2011-08-12 21:11:08 |
+----+---------------------+

MariaDB [adb]> select id,insert_on from atable order by id desc limit 10;
+--------+---------------------+
| id     | insert_on           |
+--------+---------------------+
| 409279 | 2019-07-11 00:34:28 |
| 409278 | 2019-07-11 00:24:26 |
| 409277 | 2019-07-11 00:14:28 |
| 409276 | 2019-07-11 00:04:29 |
| 409275 | 2019-07-10 23:54:43 |
| 409274 | 2019-07-10 23:44:29 |
| 409273 | 2019-07-10 23:34:27 |
| 409272 | 2019-07-10 23:24:27 |
| 409271 | 2019-07-10 23:14:29 |
| 409270 | 2019-07-10 23:04:27 |
+--------+---------------------+

本題

insert_on の値を unixtime に変換した上で剰余演算して n 分間隔に均す

MariaDB [adb]> select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*20) second
    -> from atable limit 10;
+----+-----------------------------------------------------------+
| id | insert_on -interval UNIX_TIMESTAMP(insert_on)%1200 second |
+----+-----------------------------------------------------------+
|  1 | 2011-08-12 19:40:00                                       |
|  2 | 2011-08-12 19:40:00                                       |
|  3 | 2011-08-12 20:00:00                                       |
|  4 | 2011-08-12 20:00:00                                       |
|  5 | 2011-08-12 20:20:00                                       |
|  6 | 2011-08-12 20:20:00                                       |
|  7 | 2011-08-12 20:40:00                                       |
|  8 | 2011-08-12 20:40:00                                       |
|  9 | 2011-08-12 21:00:00                                       |
| 10 | 2011-08-12 21:00:00                                       |
+----+-----------------------------------------------------------+

MariaDB [adb]> select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second
    -> from atable limit 10;
+----+-----------------------------------------------------------+
| id | insert_on -interval UNIX_TIMESTAMP(insert_on)%2400 second |
+----+-----------------------------------------------------------+
|  1 | 2011-08-12 19:40:00                                       |
|  2 | 2011-08-12 19:40:00                                       |
|  3 | 2011-08-12 19:40:00                                       |
|  4 | 2011-08-12 19:40:00                                       |
|  5 | 2011-08-12 20:20:00                                       |
|  6 | 2011-08-12 20:20:00                                       |
|  7 | 2011-08-12 20:20:00                                       |
|  8 | 2011-08-12 20:20:00                                       |
|  9 | 2011-08-12 21:00:00                                       |
| 10 | 2011-08-12 21:00:00                                       |
+----+-----------------------------------------------------------+

grouo by で間引く

MariaDB [adb]> select id,insert_on,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*20) second as dit20
    -> from atable group by dit20 limit 10;
+----+---------------------+---------------------+
| id | insert_on           | dit20               |
+----+---------------------+---------------------+
|  1 | 2011-08-12 19:49:24 | 2011-08-12 19:40:00 |
|  3 | 2011-08-12 20:01:04 | 2011-08-12 20:00:00 |
|  5 | 2011-08-12 20:21:08 | 2011-08-12 20:20:00 |
|  7 | 2011-08-12 20:41:04 | 2011-08-12 20:40:00 |
|  9 | 2011-08-12 21:01:04 | 2011-08-12 21:00:00 |
| 11 | 2011-08-12 21:21:07 | 2011-08-12 21:20:00 |
| 13 | 2011-08-12 21:51:06 | 2011-08-12 21:40:00 |
| 14 | 2011-08-12 22:01:23 | 2011-08-12 22:00:00 |
| 16 | 2011-08-12 22:31:30 | 2011-08-12 22:20:00 |
| 17 | 2011-08-12 22:41:06 | 2011-08-12 22:40:00 |
+----+---------------------+---------------------+

MariaDB [adb]> select id,insert_on,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit40
    -> from atable group by dit40 limit 10;
+----+---------------------+---------------------+
| id | insert_on           | dit40               |
+----+---------------------+---------------------+
|  1 | 2011-08-12 19:49:24 | 2011-08-12 19:40:00 |
|  5 | 2011-08-12 20:21:08 | 2011-08-12 20:20:00 |
|  9 | 2011-08-12 21:01:04 | 2011-08-12 21:00:00 |
| 13 | 2011-08-12 21:51:06 | 2011-08-12 21:40:00 |
| 16 | 2011-08-12 22:31:30 | 2011-08-12 22:20:00 |
| 19 | 2011-08-12 23:01:31 | 2011-08-12 23:00:00 |
| 23 | 2011-08-12 23:41:06 | 2011-08-12 23:40:00 |
| 27 | 2011-08-13 00:21:10 | 2011-08-13 00:20:00 |
| 31 | 2011-08-13 01:01:08 | 2011-08-13 01:00:00 |
| 35 | 2011-08-13 01:41:05 | 2011-08-13 01:40:00 |
+----+---------------------+---------------------+

間引いた結果の id と一致するレコードを他テーブルから引っ張る

  • テーブルが一つだけなので元テーブルを使うけど、たぶんこんな感じ
MariaDB [adb]> select id,insert_on from atable as tmp where exists (
    ->   select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit
    ->   from atable group by dit having id=tmp.id
    -> ) limit 10;
+----+---------------------+
| id | insert_on           |
+----+---------------------+
|  1 | 2011-08-12 19:49:24 |
|  5 | 2011-08-12 20:21:08 |
|  9 | 2011-08-12 21:01:04 |
| 13 | 2011-08-12 21:51:06 |
| 16 | 2011-08-12 22:31:30 |
| 19 | 2011-08-12 23:01:31 |
| 23 | 2011-08-12 23:41:06 |
| 27 | 2011-08-13 00:21:10 |
| 31 | 2011-08-13 01:01:08 |
| 35 | 2011-08-13 01:41:05 |
+----+---------------------+

MariaDB [adb]> select id,insert_on from atable as tmp where exists (
    ->   select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit
    ->   from atable group by dit having id=tmp.id
    -> ) order by id desc limit 10;
+--------+---------------------+
| id     | insert_on           |
+--------+---------------------+
| 409278 | 2019-07-11 00:24:26 |
| 409274 | 2019-07-10 23:44:29 |
| 409270 | 2019-07-10 23:04:27 |
| 409266 | 2019-07-10 22:24:27 |
| 409262 | 2019-07-10 21:44:27 |
| 409258 | 2019-07-10 21:04:28 |
| 409254 | 2019-07-10 20:24:28 |
| 409250 | 2019-07-10 19:44:28 |
| 409246 | 2019-07-10 19:04:26 |
| 409242 | 2019-07-10 18:24:27 |
+--------+---------------------+
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MariaDB (MySQL) の select 時で等間隔にデータを間引く

前提

  • insert_on に insert 時のタイムスタンプが入っている (他にもカラムはあるが省略)
  • "select * from atable;" で全て持ってきた上でスクリプト側で処理していたが、(VPS スペックが負けるようになったのか) スクリプトが OOM Killer の標的になり始めたので、select 時点で間引いておきたい
  • レコードは基本的に 10 分毎
    • なので、20 分毎, 40 分毎といったような間隔でレコード情報を取得したい
MariaDB [adb]> select id,insert_on from atable limit 10;
+----+---------------------+
| id | insert_on           |
+----+---------------------+
|  1 | 2011-08-12 19:49:24 |
|  2 | 2011-08-12 19:51:04 |
|  3 | 2011-08-12 20:01:04 |
|  4 | 2011-08-12 20:11:06 |
|  5 | 2011-08-12 20:21:08 |
|  6 | 2011-08-12 20:31:06 |
|  7 | 2011-08-12 20:41:04 |
|  8 | 2011-08-12 20:51:06 |
|  9 | 2011-08-12 21:01:04 |
| 10 | 2011-08-12 21:11:08 |
+----+---------------------+

MariaDB [adb]> select id,insert_on from atable order by id desc limit 10;
+--------+---------------------+
| id     | insert_on           |
+--------+---------------------+
| 409279 | 2019-07-11 00:34:28 |
| 409278 | 2019-07-11 00:24:26 |
| 409277 | 2019-07-11 00:14:28 |
| 409276 | 2019-07-11 00:04:29 |
| 409275 | 2019-07-10 23:54:43 |
| 409274 | 2019-07-10 23:44:29 |
| 409273 | 2019-07-10 23:34:27 |
| 409272 | 2019-07-10 23:24:27 |
| 409271 | 2019-07-10 23:14:29 |
| 409270 | 2019-07-10 23:04:27 |
+--------+---------------------+

本題

insert_on の値を unixtime に変換した上で剰余演算して n 分間隔に均す

MariaDB [adb]> select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*20) second
    -> from atable limit 10;
+----+-----------------------------------------------------------+
| id | insert_on -interval UNIX_TIMESTAMP(insert_on)%1200 second |
+----+-----------------------------------------------------------+
|  1 | 2011-08-12 19:40:00                                       |
|  2 | 2011-08-12 19:40:00                                       |
|  3 | 2011-08-12 20:00:00                                       |
|  4 | 2011-08-12 20:00:00                                       |
|  5 | 2011-08-12 20:20:00                                       |
|  6 | 2011-08-12 20:20:00                                       |
|  7 | 2011-08-12 20:40:00                                       |
|  8 | 2011-08-12 20:40:00                                       |
|  9 | 2011-08-12 21:00:00                                       |
| 10 | 2011-08-12 21:00:00                                       |
+----+-----------------------------------------------------------+

MariaDB [adb]> select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second
    -> from atable limit 10;
+----+-----------------------------------------------------------+
| id | insert_on -interval UNIX_TIMESTAMP(insert_on)%2400 second |
+----+-----------------------------------------------------------+
|  1 | 2011-08-12 19:40:00                                       |
|  2 | 2011-08-12 19:40:00                                       |
|  3 | 2011-08-12 19:40:00                                       |
|  4 | 2011-08-12 19:40:00                                       |
|  5 | 2011-08-12 20:20:00                                       |
|  6 | 2011-08-12 20:20:00                                       |
|  7 | 2011-08-12 20:20:00                                       |
|  8 | 2011-08-12 20:20:00                                       |
|  9 | 2011-08-12 21:00:00                                       |
| 10 | 2011-08-12 21:00:00                                       |
+----+-----------------------------------------------------------+

grouo by で間引く

MariaDB [adb]> select id,insert_on,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*20) second as dit20
    -> from atable group by dit20 limit 10;
+----+---------------------+---------------------+
| id | insert_on           | dit20               |
+----+---------------------+---------------------+
|  1 | 2011-08-12 19:49:24 | 2011-08-12 19:40:00 |
|  3 | 2011-08-12 20:01:04 | 2011-08-12 20:00:00 |
|  5 | 2011-08-12 20:21:08 | 2011-08-12 20:20:00 |
|  7 | 2011-08-12 20:41:04 | 2011-08-12 20:40:00 |
|  9 | 2011-08-12 21:01:04 | 2011-08-12 21:00:00 |
| 11 | 2011-08-12 21:21:07 | 2011-08-12 21:20:00 |
| 13 | 2011-08-12 21:51:06 | 2011-08-12 21:40:00 |
| 14 | 2011-08-12 22:01:23 | 2011-08-12 22:00:00 |
| 16 | 2011-08-12 22:31:30 | 2011-08-12 22:20:00 |
| 17 | 2011-08-12 22:41:06 | 2011-08-12 22:40:00 |
+----+---------------------+---------------------+

MariaDB [adb]> select id,insert_on,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit40
    -> from atable group by dit40 limit 10;
+----+---------------------+---------------------+
| id | insert_on           | dit40               |
+----+---------------------+---------------------+
|  1 | 2011-08-12 19:49:24 | 2011-08-12 19:40:00 |
|  5 | 2011-08-12 20:21:08 | 2011-08-12 20:20:00 |
|  9 | 2011-08-12 21:01:04 | 2011-08-12 21:00:00 |
| 13 | 2011-08-12 21:51:06 | 2011-08-12 21:40:00 |
| 16 | 2011-08-12 22:31:30 | 2011-08-12 22:20:00 |
| 19 | 2011-08-12 23:01:31 | 2011-08-12 23:00:00 |
| 23 | 2011-08-12 23:41:06 | 2011-08-12 23:40:00 |
| 27 | 2011-08-13 00:21:10 | 2011-08-13 00:20:00 |
| 31 | 2011-08-13 01:01:08 | 2011-08-13 01:00:00 |
| 35 | 2011-08-13 01:41:05 | 2011-08-13 01:40:00 |
+----+---------------------+---------------------+

間引いた結果の id と一致するレコードを他テーブルから引っ張る

  • テーブルが一つだけなので元テーブルを使うけど、たぶんこんな感じ
MariaDB [adb]> select id,insert_on from atable as tmp where exists (
    ->   select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit
    ->   from atable group by dit having id=tmp.id
    -> ) limit 10;
+----+---------------------+
| id | insert_on           |
+----+---------------------+
|  1 | 2011-08-12 19:49:24 |
|  5 | 2011-08-12 20:21:08 |
|  9 | 2011-08-12 21:01:04 |
| 13 | 2011-08-12 21:51:06 |
| 16 | 2011-08-12 22:31:30 |
| 19 | 2011-08-12 23:01:31 |
| 23 | 2011-08-12 23:41:06 |
| 27 | 2011-08-13 00:21:10 |
| 31 | 2011-08-13 01:01:08 |
| 35 | 2011-08-13 01:41:05 |
+----+---------------------+

MariaDB [adb]> select id,insert_on from atable as tmp where exists (
    ->   select id,insert_on -interval UNIX_TIMESTAMP(insert_on)%(60*40) second as dit
    ->   from atable group by dit having id=tmp.id
    -> ) order by id desc limit 10;
+--------+---------------------+
| id     | insert_on           |
+--------+---------------------+
| 409278 | 2019-07-11 00:24:26 |
| 409274 | 2019-07-10 23:44:29 |
| 409270 | 2019-07-10 23:04:27 |
| 409266 | 2019-07-10 22:24:27 |
| 409262 | 2019-07-10 21:44:27 |
| 409258 | 2019-07-10 21:04:28 |
| 409254 | 2019-07-10 20:24:28 |
| 409250 | 2019-07-10 19:44:28 |
| 409246 | 2019-07-10 19:04:26 |
| 409242 | 2019-07-10 18:24:27 |
+--------+---------------------+
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpringでMySQLエラー Unknown column ' 値1 ' in 'field list'

Spring Java の Entityで

Unknown column ' 値1 ' in 'field list'

が出てハマりました。

結論から言うと大文字が混ざっていたのが問題でした。

ターミナルからMySQLに直接SQLを流し込むと大文字でも正常に動作しますが、
Spring + Java のプログラムから呼び出そうとするとカラムがないというエラーになります。

field がない と特定の列名を指定してくる場合はカラムに日本語や大文字などが混ざっていないか注意しましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む