前提・実現したいこと
昨日に引き続き、わからないことが出てきてしまったので、再度質問します。
sqlを使い3っつのテーブルを結合させて取得してきたデータを、思ったような形に並べ替えたいです。
存在するテーブルの説明
stores table
table
1code|name |image |access_walk|pr |budget| 2a |〇〇屋|https://~~~|5 |文字 |3000 | 3b |????????屋|https://~~~|6 |文字 |3000 | 4c |△△屋|https://~~~|7 |文字 |3000 | 5. 6.
drink_prices table
store_code|drink_id |drink_price| a |1 |300 | a |1 |320 | a |2 |500 | b |1 |200 | b |2 |350 | c |1 |400 | c |3 |600 | . .
同じstore_code 内で drink_id が同じで、 drink_price だけが違うものがあります。
これは、同じミックスジュースでもサイズが違うなどの理由で同じ drink_id の drink_price だけ違う物がデータとして入っています。
drinks table
id|name 1 |ミックスジュース 2 |トマトジュース 3 |お茶 . .
これらのテーブルをまとめるsql文
sql
1select 2 drink_prices.store_code, 3 stores.name, 4 image, 5 access_walk, 6 pr, 7 budget, 8 drink_price, 9 drinks.name 10from 11 drink_prices 12 INNER JOIN drinks ON drink_prices.drink_id = drinks.id 13 INNER JOIN stores ON drink_prices.store_code = stores.code 14where drink_prices.id in(select min(drink_prices.id) from drink_prices INNER JOIN drinks ON drink_prices.drink_id = drinks.id group by store_code, drinks.name);
これの文を打つ理由としては、
drink_prices tableを基準にして3っつのテーブルを結合したうえで、drink_prices tableの被っているnameのデータを省いています。
この時点ですでに1つ思い通りにデータが取れていなくて、取得したデータは以下のようなものになっています。
hash
1[{"store_code"=>"a", "name"=>"ミックスジュース", "image"=>"https://~~~.jpg", 2 "access_walk"=>5, "pr"=>"pr文", "budget"=>3000, "drink_price"=>300}, 3 4{"store_code"=>"a", "name"=>"トマトジュース", "image"=>"https://~~~.jpg", 5 "access_walk"=>5, "pr"=>"pr文", "budget"=>3000, "drink_price"=>500}, 6 7{"store_code"=>"b", "name"=>"ミックスジュース", "image"=>"https://~~~.jpg", 8 "access_walk"=>6, "pr"=>"pr文", "budget"=>3000, "drink_price"=>200}, 9 10{"store_code"=>"b", "name"=>"トマトジュース", "image"=>"https://~~~.jpg", 11 "access_walk"=>6, "pr"=>"pr文", "budget"=>3000, "drink_price"=>350,}, 12. 13. 14]
sql文では、drinks.name と stores.name をselectで指定しているのですが、取れているのはdrinks.nameだけになってしまいました。〇〇屋というお店の名前が抜けてしまっています。
このデータ形式を、以下のような形に変えたいと思っています。
[{"store_code"=>"a", "name"=>"〇〇屋", "image"=>"https://~~~.jpg", "access_walk"=>5, "pr"=>"pr文", "budget"=>3000, "drink_price"=>300, "name"=>["ミックスジュース","トマトジュース"]}, {"store_code"=>"b", "name"=>"????????屋", "image"=>"https://~~~.jpg", "access_walk"=>6, "pr"=>"pr文", "budget"=>3000, "drink_price"=>200, "name"=>["ミックスジュース","トマトジュース"]}, . . ]
store_code a の中に、飲み物の名前が"name"=>["ミックスジュース","トマトジュース"]のような形にしたいです。
drink_priceの値も複数あるのにもかかわらず1つになっているのは、ここの値は最小の値を取りたいと考えているからです。
同じstore_codeの
- store_code
- stores.name
- image
- access_walk
- pr
- budget
をまとめ、
同じstore_codeの
- drink_price
の最小の値を1つとり、
- drinks.name
をstore_codeごとに配列としてまとめたいです。
tableに問い合わせる段階で整形するのか、取り寄せた後に整形するのか、どちらがやりやすいのかもわからず困っています...
結局知りたいこと
- tableを結合した結果、同名のカラム(今回はname)が2つ以上ある場合、これを出力後に判別する方法。または、判別できるよう形で出力にする方法。
- { store_code,
stores.name,
image,
access_walk,
pr,
budget,
drink_price,
drinks.name[]
}
のデータ形式に出力する方法。または、tableからデータを取得した後に、上記の形式にデータを整形する方法。
補足情報(FW/ツールのバージョンなど)
Rails 6.0.3.4
ruby 2.6.5
sqLite3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/26 10:03
2020/10/26 11:49
2020/10/26 12:05
2020/10/26 12:27
2020/10/26 13:10
2020/10/26 13:51 編集