質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1114閲覧

多段のMySQLのクエリー

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/10/24 02:28

編集2018/10/24 02:50

複数テーブルがからむリクエストをはじめてかくのでどうかいたらいいかわかりません

users と user_status というテーブルがあって
user_status のカラムは user_id と status_id のペアがはいってます

class CreateUserStatuses < ActiveRecord::Migration def change create_table :user_statuses do |t| t.references :user, foreign_key: true, null: false t.integer :status_id, null: false t.timestamps null: false end end end

status_id の配列を検索キーにして
user_status にそのペアが存在するユーザ ID のユーザだけ検索するにはどうすればいいでしょうか

正確な文法ではないのですが

User.where(|user| UserStatus.where(user_id: user.id, p_status_id: p_status_list) != nil)

みたいな条件で検索したいです

つまり検索中のユーザのIDを他のテーブル検索の条件につかいたいんですがこういうことってできるのでしょうか

サンプル:

[users table]
1
2
3

[user_statuses table]
user_id status_id
1 1
1 2
1 3
2 2
2 3
2 4
3 3
3 4
3 5

(ユーザ1 はステータス 1,2,3
ユーザ2 はステータス 2,3,4
ユーザ3 はステータス 3,4,5
をもってる)

で status_list = [2,3] を検索キーとしてあたえたときにこの全部をもっているユーザを探して
この場合 ユーザ1 とユーザ2 (ユーザ3 はステータス 2 をもってないので除外)
を id ではなく [<User1> <User2>] のような users のリレーションとして出力したいです
(このあと Users に対しても where でしぼりこみをかけるため)

users.where("id IN (SELECT user_id FROM user_statuses WHERE status_id IN #{status_list})")

のようにかけば動きそうな気がするのですが user_statuses をインデックスのついてない status_id で検索してることになって遅くならなりそうなので、user_statuses の検索は foreign key? (意味がよくわかってないですが)のついてるuser_id をキーに検索をかけたいです

Rails の ActiveRecord メソッドとSQLがまざってしまってますがすいません…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/10/24 02:32

テーブルの構造と、サンプルデータ、どういった結果を希望するのか提示してください
guest

回答1

0

ベストアンサー

  • 元データ

SQL

1create table users(user_id int primary key,user_name varchar(20)); 2insert into users values(1,'user1'),(2,'user2'),(3,'user3'); 3create table user_statuses(user_id int, status_id int,unique key(user_id,status_id)); 4insert into user_statuses values(1,1),(1,2),(1,3),(2,2),(2,3),(2,4),(3,3),(3,4),(3,5);
  • status_idが2と3の両方を含むもの

SQL

1select user_id from user_statuses where status_id in(2,3) group by user_id 2having count(*)=2

※count(*)=2の「2」は2,3の2個を含むという意味

  • リレーションして

SQL

1select * from users as t1 where exists( 2select 1 from user_statuses where status_id in(2,3) group by user_id 3having count(*)=2 and user_id =t1.user_id 4)

投稿2018/10/24 02:59

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/24 03:46 編集

回答ありがとうございます as を使うことで検索中のレコードのカラムをさらに他のテーブルの条件に使うことができるのですね すいません 知識不足ですぐに理解できないのでとりあえずお礼だけさせてください リレーションで使いたいというのは Rails のアクティブレコードの where 文で条件をつなげたかったからなのですが、select ではなく where の中に as を含む構文をいれる方法がわからないのと group by と count もわりと定番の書き方みたいですがはじめてみたので 意味を理解するためにもう少し調べてみたいと思います
yambejp

2018/10/24 03:56

まぁ今回は自己結合ではないので別名(users as t1)をつかわずに 参照時にテーブル名を直接指定してもいいですね 「user_id =t1.user_id」→「user_id =users.user_id」
退会済みユーザー

退会済みユーザー

2018/10/24 07:02

ようやくわかりました group by がなぜ必要かよくわかってなくて status_id in (1, 2) && user_id == user.id のレコードが2個かどうか調べるだけでいいと思ったんですけど having_count を使うのに group by が必要だったのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問