2012-07-27 3 views
1

다음 쿼리가 있는데 평균 순위가 가장 높은 멤버가 먼저 표시되는 순서로 멤버를 표시하려고합니다. 가장 높은 평가 수를 고려합니다. 회원 B 2 방문자에 의해 평가 및 평균 평가 값이 5AVG 및 COUNT 함수가 SQL 쿼리에서 적절한 결과를 제공하지 않습니다.

입니다 그래서 쿼리 아래, 회원 A는해야에 따라하고있는 동안 3 방문자와 평균 평가 가치에 의해 평가 된 회원 여기

는 5 그는 평균 평점이 5이고 3 인으로 평가되었으므로 먼저 표시하고 B 회원은 두 번째 위치에 표시해야합니다.

하지만 회원 B가 먼저 표시하고 회원 A가 두 번째를 표시하므로 문제가 있습니다. 질문에서 내가 뭘 잘못하고 있는지 알려주세요.

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 

는 SELECT 절에, ORDER 절 밖으로 AVG 및 COUNT 기능 KRA에게 사전에 당신에게

+1

회원과 카테고리간에 일대일 관계가 있습니까? 그렇지 않은 경우 결과는 [불확정] (http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)입니다. –

+0

어떤 데이터 유형이 ratingvalue입니까? Int 또는 약간의 변동 가치? A 및 B 등급 값은 무엇입니까? –

+0

rating 값 데이터 유형이 bigint (20) A는 3, 5, 5, 5이므로 평균값은 5입니다. A의 평점은 2와 5이고 평균값은 5이므로 – KRA

답변

0

이동 대단히 감사합니다. 그들에게 좋은 이름을주고 그들에게 주문하십시오. 즉

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을 작성하는 동안이를 명심하십시오.

+0

안녕하세요, Maarten Jacobs 도움 주셔서 감사합니다. 나는 당신이 위에서 말한 것을 해냈고, 이제는 집계 기능에 관해 당신이 말한 것을 이해합니다. 하지만 불행히도 그것은 내 문제를 해결하지 못하고 이전과 같은 결과를줍니다. 이 문제를 해결하는 데 도움을 줄 수 있습니까? – KRA

관련 문제