2013-06-10 6 views
1

사용자, 레스토랑, 리뷰라는 3 개의 테이블이 있습니다. 여기서 사용자의 id (프라이 머리 키)는 레스토랑에서 외래 키 uid 역할을하며 리뷰 테이블에서 rate_to는 레스토랑의 uid와 연결되며 rate_by는 사용자 테이블의 id와 연결됩니다. 모든 레스토랑을 식당 테이블의 해당 사용자에게 속하게하고 리뷰 테이블에서 avg_rate로 정렬하도록합니다. 나는 이것을 위해이 쿼리를 사용했다.mysql에서 join으로 group by를 사용할 때 적절한 결과를 얻지 못합니다.

SELECT `Restaurant`.`id`, `Review`.`avg_rating`, `Review`.`rate_to` 
FROM `users` AS `User` 
LEFT JOIN `reviews` AS `Review` ON (`User`.`id` = `Review`.`rate_to`) 
LEFT JOIN `restaurants` AS `Restaurant` ON (`User`.`id` = `Restaurant`.`uid`) 
WHERE `User`.`type` = '0' AND `User`.`isdeleted` = '0' 
GROUP BY `Review`.`rate_to` ORDER BY `Review`.`avg_rating` DESC  

하지만이 사용하고 때 나에게 리뷰 테이블에 항목이 만 레스토랑을 제공하지만, 리뷰 테이블에 avg_rate으로 분류하여 내가 레스토랑 테이블의 모든 별개의 레스토랑을 원한다.

도와주세요.

+0

참조 키가 혼란 스럽습니다. review (rate_to)는 대중 음식점 (uid)을 참조 (id)합니다. 완벽한 테이블 구조를 제공 할 수 있습니까? – chetan

답변

1

내가 여기에서 볼 수있는이 시도 할 수 result.You에 대한 사용자 테이블의 아무 소용 없다 : 당신의

당신은 (비 집계) 한
SELECT `Resturant`.`id` , MAX(`Review`.`avg_rating`) AS max_avg, `Review`.`rate_to` FROM `resturants` AS `Resturant` LEFT JOIN reviews AS Review ON (`Resturant`.`uid` = `Review`.`rate_to`) WHERE 1 GROUP BY `Resturant`.`id` ORDER BY `Review`.`avg_rating` DESC 
+0

고맙습니다. 나를 위해 잘 작동합니다. –

+0

'rate_to'는 여전히 GROUP BY와 집계 함수 모두에 있지 않습니다. 실제 데이터에 따라 문제가 될 수도 문제가되지 않을 수도 있지만 한 가지 또는 다른 방법을 사용하고 "교수형"상태로 두지는 않습니다. –

0

이 경우 왼쪽 결합이 두 번 작동하는지 확실하지 않습니다. 하위 쿼리를 사용해야할까요?

1

필드하여 GROUP에 언급되지 않은 목록을 선택 .

대부분의 DBMS는이를 금지합니다. MySQL은 그렇지 않으며, 결과적으로 당신은 essentially random results을 얻을 것입니다.

0

반대 순서로 나열하십시오 (예 :

SELECT `Restaurant`.`id`, `Review`.`avg_rating`, `Review`.`rate_to` 
FROM `restaurants` AS `Restaurant` 
LEFT JOIN `reviews` AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
LEFT JOIN `users` AS `User` ON (`User`.`id` = `Review`.`rate_by`) 
WHERE `User`.`type` = '0' AND `User`.`isdeleted` = '0' 
GROUP BY `Restaurant`.`id` ORDER BY `Review`.`avg_rating` DESC 

그러면 모든 식당을 갖출 것입니다. Review.avg_ratingReview.rate_to은 집계 함수가 아니기 때문에 여전히 작동하지 않습니다. 집계가 필요한 경우 User이 어떻게 작동하는지 알 수 없습니다.

더해야

SELECT `Restaurant`.`id`, AVG(`Review`.`avg_rating`) 
FROM `restaurants` AS `Restaurant` 
LEFT JOIN `reviews` AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
GROUP BY `Restaurant`.`id` 
ORDER BY AVG(`Review`.`avg_rating`) DESC 

을 시도,하지만 당신은 모든 삭제 된 사용자를 포함합니다.

당신이 DDL을 우리에게 제공하지 않았으므로
SELECT `Restaurant`.`id`, AVG(`Review`.`avg_rating`) 
FROM `restaurants` AS `Restaurant` 
LEFT JOIN (select r.* from `reviews` r 
    JOIN `users` AS `User` ON (`User`.`id` = `Review`.`rate_by`) 
    WHERE `User`.`type` = '0' AND `User`.`isdeleted` = '0' 
) AS `Review` ON (`Review`.`rate_to` = `Restaurant`.`uid`) 
GROUP BY `Restaurant`.`id` 
ORDER BY AVG(`Review`.`avg_rating`) DESC 

, 나는 그 중 하나를 테스트하지 않았습니다 : 위해

가 삭제 된 사용자가 남긴 리뷰를 없애, 당신은 아마 하위 쿼리가 필요합니다.

관련 문제