1

次のクエリがあり、平均評価が最も高いメンバーが最初に表示される順序でメンバーを表示しようとしています。複数のメンバーが同じ平均評価を持っている場合、評価の最大数が考慮されます。

ここでは、メンバー A は 3 人の訪問者によって評価され、平均評価値は 5 であり、メンバー B は 2 人の訪問者によって評価され、平均評価値は 5 です。

したがって、以下のクエリによると、メンバー A は平均評価が 5 で 3 人から評価されているため、最初に表示され、メンバー B は 2 番目に表示されるはずです。

しかし、メンバー B が最初に表示され、メンバー A が 2 番目に表示されるため、これは問題です。クエリで何が間違っているのか教えてください。

SELECT m.*,mc.* 
FROM      t_member m
LEFT JOIN tr_member_category mc ON m.memberpkid=mc.memberpkid
LEFT JOIN tr_comment c 
          ON m.memberpkid=c.memberpkid 
             AND c.approved='YES' AND c.visible='YES' 
WHERE m.visible='YES' AND m.approved='YES' 
       AND m.gender='FEMALE' AND mc.archivecatpkid=1 
GROUP BY m.memberpkid
ORDER BY avg(c.ratingvalue) DESC, COUNT(c.ratingvalue) DESC 

よろしくお願いします、KRA

4

1 に答える 1

0

AVG および COUNT 関数を ORDER 句から SELECT 句に移動します。それらに適切な名前を付けてから、それらを注文してください。すなわち

SELECT m.*, mc.*, AVG(c.ratingvalue) AS average_rating, COUNT(c.ratingvalue) AS number_of_ratings
FROM      t_member m
LEFT JOIN tr_member_category mc ON m.memberpkid=mc.memberpkid
LEFT JOIN tr_comment c 
      ON m.memberpkid=c.memberpkid 
         AND c.approved='YES' AND c.visible='YES' 
WHERE m.visible='YES' AND m.approved='YES' 
   AND m.gender='FEMALE' AND mc.archivecatpkid=1 
GROUP BY m.memberpkid
ORDER BY average_rating DESC, number_of_ratings DESC 

編集: 集計関数は値を返すことに注意してください。それらを ORDER BY 句に入れると、「このによる順序」ではなく、「この値による順序」になります。SQL を書くときは、この点に注意してください。

于 2012-07-27T07:39:06.157 に答える