has_many レビューの Course モデルがあります。私の Review モデルには評価フィールドがあります。私が欲しいのは、最高評価のコースを見つけるためのクエリです。すべてのコース オブジェクトを返してからランク付けして並べ替えようとするのを避けるために、SQL でこれを実行したいと考えています。
4 に答える
私はこの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で除算することは避けてください。
「最高評価」をどのように定義するかを説明していません。個々の評価が最も高いコースが必要な場合があります。
Course.joins(:reviews).group("courses.id").order("reviews.rating desc")
または、合計評価が最も高いコースが必要な場合があります。
Course.joins(:reviews).group("courses.id").order("sum(reviews.rating) desc")
次に、これらのそれぞれで、必要なfirst(10)
基準でトップ 10 を取得するために呼び出すことができます。
あなたはこれを試すことができます
select * from courses where review=(select max(rating) from table)
また
select top 1.* from courses order by review desc
これを試して
@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`