Railsでいろいろ検索してみる
seedで初期データを追加してみるの続き
(RailsのMySQLの環境にアクセスできるようにしておくも済ませておく)
Railsでいろいろ検索してみる。
現在、Userのテーブルには以下のデータが入っている状態。
+----+--------+-------+------+------------+---------------------+---------------------+ | id | name | point | flag | day | created_at | updated_at | +----+--------+-------+------+------------+---------------------+---------------------+ | 1 | 佐藤 | 100 | 1 | 2001-01-01 | 2014-01-12 07:09:56 | 2014-01-12 07:09:56 | | 2 | 鈴木 | 200 | 0 | 2002-02-02 | 2014-01-12 07:09:56 | 2014-01-12 07:09:56 | | 3 | 高橋 | 300 | 1 | 2003-03-03 | 2014-01-12 07:09:56 | 2014-01-12 07:09:56 | | 4 | 田中 | 400 | 0 | 2004-04-04 | 2014-01-12 07:09:56 | 2014-01-12 07:09:56 | | 5 | 伊藤 | 500 | 1 | 2005-05-05 | 2014-01-12 07:09:56 | 2014-01-12 07:09:56 | +----+--------+-------+------+------------+---------------------+---------------------+
検索した結果は、下記のような感じで、jsonで画面に出力して確認する。
class SampleController < ApplicationController def index results = User.all() render :json => results end end
以後、User.・・・の部分だけ載せていく。
all
全件取得する。
User.all()
SQL:
SELECT `users`.* FROM `users`
結果:
[ {"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":2,"name":"鈴木","point":200,"flag":false,"day":"2002-02-02","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":3,"name":"高橋","point":300,"flag":true,"day":"2003-03-03","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":4,"name":"田中","point":400,"flag":false,"day":"2004-04-04","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":5,"name":"伊藤","point":500,"flag":true,"day":"2005-05-05","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"} ]
※実際は画面に一行で表示されますが、見やすいように改行してます。
first
一件目を取得する。
User.first()
SQL:
SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
結果:
{"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}
where
条件を指定する。
User.where(:point => [100, 200, 300], :flag => true)
SQL:
SELECT `users`.* FROM `users` WHERE `users`.`point` IN (100, 200, 300) AND `users`.`flag` = 1
結果:
[ {"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":3,"name":"高橋","point":300,"flag":true,"day":"2003-03-03","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"} ]
比較演算子で条件を指定する。
User.where('point < 500')
SQL:
SELECT `users`.* FROM `users` WHERE (point < 500)
結果:
[ {"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":2,"name":"鈴木","point":200,"flag":false,"day":"2002-02-02","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":3,"name":"高橋","point":300,"flag":true,"day":"2003-03-03","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":4,"name":"田中","point":400,"flag":false,"day":"2004-04-04","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"} ]
select
取得するカラムを指定する。
User.select(:id, :name)
SQL:
SELECT id, name FROM `users`
結果:
[ {"id":1,"name":"佐藤"}, {"id":2,"name":"鈴木"}, {"id":3,"name":"高橋"}, {"id":4,"name":"田中"}, {"id":5,"name":"伊藤"} ]
order
順序を変更する。
User.order('id desc')
SQL:
SELECT `users`.* FROM `users` ORDER BY id desc
結果:
[ {"id":5,"name":"伊藤","point":500,"flag":true,"day":"2005-05-05","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":4,"name":"田中","point":400,"flag":false,"day":"2004-04-04","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":3,"name":"高橋","point":300,"flag":true,"day":"2003-03-03","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":2,"name":"鈴木","point":200,"flag":false,"day":"2002-02-02","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"} ]
limit
検索結果を絞り込む。
User.limit(2)
SQL:
SELECT `users`.* FROM `users` LIMIT 2
結果:
[ {"id":1,"name":"佐藤","point":100,"flag":true,"day":"2001-01-01","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"}, {"id":2,"name":"鈴木","point":200,"flag":false,"day":"2002-02-02","created_at":"2014-01-12T07:09:56.000Z","updated_at":"2014-01-12T07:09:56.000Z"} ]
まとめて指定する
まとめて指定する。
User.select('id, name').where('point < 500').order('id desc').limit(2)
SQL:
SELECT id, name FROM `users` WHERE (point < 500) ORDER BY id desc LIMIT 2
結果:
[ {"id":4,"name":"田中"}, {"id":3,"name":"高橋"} ]
maximum
最大値を取得する。
(最小値はminimumで取得できる)
User.maximum(:point)
SQL:
SELECT MAX(`users`.`point`) AS max_id FROM `users`
結果:
500
group
group byする。
User.group('flag').count()
SQL:
SELECT COUNT(*) AS count_all, flag AS flag FROM `users` GROUP BY flag
結果:
{"false":2,"true":3}