2012-05-10 25 views
0

私は別の質問を思いつきました。私はMySqlクエリを考案しようとしています。受注別集計関数MySql

私はUsersテーブルとRatingsテーブルを持っています。user_idは、格付け表の外来キーです。

は今、私は最大平均評価

を持つユーザーを取得する必要がありますので、私でした:

SELECT blah blah FROM Users USR 
INNER JOIN Ratings RTN on USR.id = RTN.user_id 
order by avg(RTN.rating) 

しかし、私は、これは間違っていると感じてそこにそのも動作していないeither.Is取得する方法ユーザーが降順で受け取った平均評価で注文しましたか?

よろしくお願いいたします。 ヒマンシュシャルマ。

+4

うん、あなたは実際に集約を行う必要があります。 MySQLでは、集約関数を 'GROUP BY'なしで使用することができますが、これはかなり役に立たないものです。 – JNK

+0

ご注意ありがとうございます@JNK私たちがuserid = some valueを選択するとどうなりますか?その場合はグループを必要としません –

+1

はい、しかし、集約されていないフィールドがある場合はMySQLだけがそれを許可します。 – JNK

答えて

1

あなたの検索によって、標準的なグループを必要とするよりも、あなただけのユーザーデータが必要な場合、私はこのようにそれを記述します:

SELECT USR.id, AVG(RTN.rating) AS avg_rating 
FROM Users USR 
INNER JOIN Ratings RTN ON USR.id = RTN.user_id 
GROUP BY USR.id 
ORDER BY avg_rating DESC 
LIMIT 1 
1

Average ratingを計算し、評価データを含める場合は、Average ratingを計算するインラインビューを使用できます。

SELECT blah blah 
FROM Users USR 
    INNER JOIN Ratings RTN 
    ON USR.id = RTN.user_id 
    INNER JOIN (SELECT avg(RTN.rating) Avg_rating 
       FROM Ratings RTN 
       GROUP BY 
       rtn.user_id) a_rtn 
    ON USR.id = A_RTN.user_id 

ORDER BY avg(A_RTN.AVg_rating) DESC 

あなただけの(スタートのように)実際には非常に間違っていないようです

SELECT USR.First_name, USR.Last_name, etc 
FROM Users USR 
    INNER JOIN Ratings RTN 
    ON USR.id = RTN.user_id 

GROUP BY 
    USR.First_name, USR.Last_name, etc  
ORDER BY avg(A_RTN.AVg_rating) DESC 
1
select blah, blah 
    from users usr 
    join (
    select rtn.user_id, avg(rtn.rating) as avg_rating 
    from users usr 
    join ratings rtn on usr.id = rtn.user_id 
    group by rtn.user_id 
    ) t on t.user_id = usr.id 
    order by avg_rating desc