0

has_many レビューの Course モデルがあります。私の Review モデルには評価フィールドがあります。私が欲しいのは、最高評価のコースを見つけるためのクエリです。すべてのコース オブジェクトを返してからランク付けして並べ替えようとするのを避けるために、SQL でこれを実行したいと考えています。

4

4 に答える 4

2

私はこのSQLを試してみます:

SELECT courses.* FROM 
 (SELECT courses.*, count(*) as rating_no 
  FROM courses 
  JOIN reviews ON reviews.course_id = courses.id 
  GROUP BY reviews.course_id ) as res 
ORDER BY rating_no DESC 

アイデア:最初に、各コースのすべてのデータと評価の数を取得します。次に、それらを並べ替えます。MySQLでの私の経験では、GROUPBYとORDERBYは互いに好きではないため、サブクエリを使用しました。最初に1つのクエリを試してみたくなるかもしれませんが、うまくいくとは思えません:)評価の数だけはなく、たとえば実際の平均レートに関心がない場合は、次のようなクエリを作成できます。

SELECT courses.* FROM 
 (SELECT courses.*, (SUM(reviews.rating)/count(*)) as avg_rating 
  FROM courses 
  JOIN reviews ON reviews.course_id = courses.id 
  GROUP BY reviews.course_id HAVING count(*) > 0) as res 
ORDER BY rating_no DESC 

count(*)> 0にする必要はほとんどありませんが、追加した場合に備えて、0で除算することは避けてください。

于 2012-11-02T12:48:24.503 に答える
2

「最高評価」をどのように定義するかを説明していません。個々の評価が最も高いコースが必要な場合があります。

Course.joins(:reviews).group("courses.id").order("reviews.rating desc")

または、合計評価が最も高いコースが必要な場合があります。

Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")

次に、これらのそれぞれで、必要なfirst(10)基準でトップ 10 を取得するために呼び出すことができます。

于 2012-11-02T12:59:00.023 に答える
0

あなたはこれを試すことができます

select  * from courses where review=(select max(rating) from table)

また

select top 1.* from courses order by review desc
于 2012-11-02T04:59:13.153 に答える
0

これを試して

@courses = Course.find(:all, :joins => "INNER JOIN reviews ON reviews.courses_id = courses.id", :order => "reviews.rating DESC")

または生のSQL

`SELECT `courses`.* FROM `courses` INNER JOIN reviews ON reviews.courses_id = courses.id ORDER BY reviews.rating DESC`
于 2012-11-02T08:20:22.790 に答える