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

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

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

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

MySQL

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

Q&A

受付中

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

heroherotail
heroherotail

総合スコア17

Ruby on Rails 6

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

MySQL

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

1回答

0グッド

0クリップ

115閲覧

投稿2022/12/01 12:40

編集2022/12/01 13:10

前提

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 を貼るべきでしょうか?

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

yuma.inaura

2022/12/01 13:00

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

回答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

総合スコア1371

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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 だけに絞るといかがでしょうか

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 6

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

MySQL

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