###前提・実現したいこと
railsを使用しています。
【カテゴリテーブル】
id|name|
1|野菜|
2|果物|
3|炭水化物|
【買い物テーブル】
id|person|c1|c2|c3|
1|たかし|1|2|3|
c1、c2、c3はカテゴリテーブルと関連付けています。
求める結果
1|たかし|野菜|果物|炭水化物|
とカテゴリ名をsqlで算出したいのです。
としたいのですが、どのようなsqlであれば実現できるでしょうか?
railsを利用しているので単純なsqlとrailsでの表現方法も教えていただけるとありがたいです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
多対多のモデルを作るとすっきりするかもです
Person テーブル
id | person |
---|---|
1 | Alice |
2 | Bob |
Category テーブル
id | name |
---|---|
1 | 野菜 |
2 | 果物 |
3 | 炭水化物 |
PersonCategory テーブル(ひも付きを持つテーブル)
id | person_id | category_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 2 |
↑のようにするとPersonCategoryを経由して
Alice(id: 1) が 野菜(id: 1), 果物(id: 2), 炭水化物(id: 3)
Bob(id: 2) が 果物(id: 2)
とひもづいているとわかります
また、上記のテーブルを持つ場合のRailsのモデルの書き方
ruby
1class Person < ActiveRecord::Base 2 has_many :categories, through: :person_categories 3 4 def category_names 5 categories.map(&:name) 6 end 7end
ruby
1class Category < ActiveRecord::Base 2 has_many :persons, through: :person_categories 3end
ruby
1class PersonCategory < ActiveRecord::Base 2 belongs_to :category 3 belongs_to :person 4end
rails consoleで実行すると
alice = Person.find_by(name: 'Alice') alice.categories # => [1,2,3] alice.category_names # => ['野菜', '果物', '炭水化物'] bob = Person.find_by(name: 'Bob') bob.categories # => [2] bob.category_names # => ['果物']
参考URL: http://ruby-rails.hatenadiary.com/entry/20141204/1417688260
投稿2017/01/26 05:12
総合スコア797
0
一応正規化を含めた簡単なsampleだけ提示しておきます
railsにそのまま応用できるかどうかはわかりませんが
概ね以下のような考え方をすればよいかとおもいます
- 元テーブル作成、データ投入
SQL
1create table tbl_c(cid int not null primary key,name varchar(20)); 2insert into tbl_c values(1,'野菜'),(2,'果物'),(3,'炭水化物'); 3 4create table tbl_k(kid int not null,person varchar(20)); 5insert into tbl_k values(1,'たかし'); 6 7create table tbl_ck(kid int,cid int); 8insert into tbl_ck values(1,1),(1,2),(1,3); 9
- kidをベースにした購入物名の列記
SQL
1select t1.kid,person,names 2from tbl_k as t1 3inner join ( 4select kid,group_concat(name) as names 5from tbl_c as t2 6inner join tbl_ck as t3 on t2.cid=t3.cid 7group by kid 8) as t4 on t1.kid=t4.kid; 9 10
投稿2017/01/24 04:10
総合スコア114505
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SQLでならこんな感じですかね。同一テーブルを別名を使って複数回 JOIN します。
SQL
1SELECT t.id, t.person, ta.name, tb.name, tc.name 2FROM 買い物テーブル AS t 3LEFT OUTER JOIN カテゴリテーブル AS ta ON (ta.id=t.c1) 4LEFT OUTER JOIN カテゴリテーブル AS tb ON (tb.id=t.c2) 5LEFT OUTER JOIN カテゴリテーブル AS tc ON (tc.id=t.c3)
そもそも買い物テーブルの構造がどうかとは思いますが。
投稿2017/01/23 03:09
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/23 05:06
2017/01/23 05:27
退会済みユーザー
2017/01/23 07:33
2017/01/23 09:44
退会済みユーザー
2017/01/23 13:53
2017/01/24 14:10
退会済みユーザー
2017/01/26 10:06
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/26 10:17
2017/01/26 10:29