1

ユーザー、レストラン、レビューという名前の 3 つのテーブルがあります。ここで、ユーザーの id (主キー) は、レストランでは外部キー uid として機能し、レビュー テーブルでは、rate_to はレストランの uid に関連付けられ、rate_by はユーザー テーブルの id に関連付けられます。すべてのレストランがレストラン テーブルのユーザーに属しているが、レビュー テーブルの avg_rate で並べ替えたいとします。これには、このクエリを使用しました。

 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 でソートされたレストランテーブルのすべての異なるレストランが必要です。

助けてください。

4

4 に答える 4

1

ここでは、結果にユーザーテーブルを使用していないことがわかります。これを試すことができます:

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
于 2013-06-10T15:16:20.837 に答える
0

この場合、左結合が 2 回機能するかどうかはわかりません。多分あなたはサブクエリを使うべきですか?

于 2013-06-10T15:08:58.667 に答える
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   

それはより良いはずですが、削除されたすべてのユーザーを含めることになります。

削除されたユーザーが残したレビューを取り除くには、おそらくサブクエリが必要になるでしょう:

 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   

DDL が提供されていないため、私はそれらをテストしていません。

于 2013-06-10T15:20:50.600 に答える