db/schema.rb
ruby
1ActiveRecord::Schema.define(version: 2018_10_29_120428) do
2
3 create_table "user_statuses", force: :cascade do |t|
4 t.integer "user_id"
5 t.integer "status"
6 t.datetime "created_at", null: false
7 t.datetime "updated_at", null: false
8 t.index ["user_id"], name: "index_user_statuses_on_user_id"
9 end
10
11 create_table "users", force: :cascade do |t|
12 t.string "name"
13 t.date "birthday"
14 t.datetime "created_at", null: false
15 t.datetime "updated_at", null: false
16 end
17
18end
にたいして、 db/seed.rb を
ruby
1user = User.create(name: "name_a")
2user.user_statuses = [
3 UserStatus.create(status:1),
4 UserStatus.create(status:2),
5 UserStatus.create(status:3)
6]
7user.save!
8
9user = User.create(name: "name_b")
10user.user_statuses = [
11 UserStatus.create(status:2),
12 UserStatus.create(status:3),
13 UserStatus.create(status:4)
14]
15user.save!
16
17user= User.create(name: "name_c")
18user.user_statuses = [
19 UserStatus.create(status:3),
20 UserStatus.create(status:4),
21 UserStatus.create(status:5)
22]
23user.save!
として、 rails db:migre と rails db:seeds して DB を作りました。
User.joins(:user_statuses).where("user_statuses.status in (2,3)").group(:name).having('COUNT(*) == 2').order(:name)
とすると、つぎの SQL が 発行できます。
SELECT "users".* FROM "users" INNER JOIN "user_statuses" ON "user_statuses"."user_id" = "users"."id"
WHERE (user_statuses.status in (2,3))
GROUP BY "users"."name" HAVING (COUNT(*) == 2)
ORDER BY "users"."name" ASC
rails c で操作して試してみます。
追記:
joins を使わない方法も考えてみました。
User.where(id: UserStatus.where(status: [2,3]).group(:user_id).having("count(*)=2").select(:user_id))
は
SELECT "users".*
FROM "users" WHERE "users"."id" IN
(
SELECT "user_statuses"."user_id"
FROM "user_statuses"
WHERE "user_statuses"."status" IN (?,?)
GROUP BY "user_statuses"."user_id"
HAVING (count(*)=2)
)
の QL を発行します。
参考
slformatter といページをつかうと 長い SQL を整形してくれます。
http://www.dpriver.com/pp/sqlformat.htm
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/10/30 04:23
2018/10/30 13:21
退会済みユーザー
2018/10/31 04:42