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

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

新規登録して質問してみよう
ただいま回答率
85.53%
Ruby on Rails 6

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

MySQL

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

Q&A

1回答

320閲覧

Rails でカテゴリーごとに人気なものを返すクエリを教えて下さい

heroherotail

総合スコア17

Ruby on Rails 6

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

MySQL

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

0グッド

0クリップ

投稿2022/12/01 12:40

編集2022/12/02 19:38

前提

Rails の習作に映画のレビューサービスを作っています。
Rails 6.0, MySQL 5.7 で sql_mode=only_full_group_by が有効な環境です。

実現したいこと

Railsで category_id, film_id, score の列を持つテーブル、 cateogory_film_scores で group by をしたいです。
category_id, film_id は unique制約があります。

ユーザが複数の category_id を指定するので、その category_id で重複なく、 score が高い順かつ、 film_id がかぶらないように返したいです。
sql_mode=TRADITONAL であれば

ruby

1CategoryFilmScore 2 .where(category_id: user_selected_cateogry_id) 3 .group(:film_id) 4 .order(score: :desc) 5 .limit(10)

というクエリで書けるものでした。

例をあげると, 以下の表でユーザがcategory_id = [10, 12] を選択した場合に

idcategory_idfilm_idscore
11010010
2101013
3101029
4111004
5111014
6111025
71210010
8121017
9121025

次の結果を得たいです。

idcategory_idfilm_idscore
11010010
8121017

Rails でどういうコードを書けばいいでしょうか?
また、どういった index を貼るべきでしょうか?

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

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

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

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

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

yuma.inaura

2022/12/01 13:00

score が最も高いものではなく、何か別の結果が得たいんでしょうか? category_id film_id score 10 100 5 は元々のデータに存在しないですよね
guest

回答1

0

:category_id でもグループ化するといかがですか?

ruby

1CategoryFilmScore 2 .where(category_id: user_selected_cateogry_id) 3 .group(:category_id, :film_id) 4 .order(score: :desc) 5 .limit(10)

投稿2022/12/02 09:52

yuma.inaura

総合スコア1451

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

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

heroherotail

2022/12/02 10:31

`.where` や `.limit` は本質的な問題ではなさそうなので一旦省いて↓を `.to_sql` してみました。 ```ruby CategoryFilmScore .group(:category_id, :film_id) .order(score: :desc) ``` ```sql SELECT `category_film_scores`.* FROM `category_film_scores` GROUP BY `category_film_scores`.`film_id`, `category_film_scores`.`category_id` ORDER BY `category_film_scores`.`score` DESC ``` やはり max などの集約関数がないため > which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (Mysql2::Error) というエラーが発生します。
yuma.inaura

2022/12/02 10:38

SELECT するカラムも GROUP BY で利用しているもの + score だけに絞るといかがでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問