[英]Propel2 joining with the table and then grouping by with aggregate function
我有兩個表:food(id,name),review(user_id,food_id,rating)。 現在我想將食物表與評論表連接起來,並在虛擬食物表中添加名稱為avg_rating的虛擬列,該虛擬列顯然將保留基於評論的食物的平均評分值。 所以我的想法是做這樣的事情:
$food = FoodQuery::create()
->filterById(15) // constant for testing purposes only
->leftJoinWithReview()
->withColumn("AVG(review.rating)", "avg_rating")
->groupBy("review.rating")
->find()
現在在調試器中,我看到以下內容:
result = {Propel\Runtime\Collection\ObjectCollection} [7]
index = {array} [1]
indexSplHash = {array} [1]
model = "Food"
fullyQualifiedModel = \Food
formatter = {Propel\Runtime\Formatter\ObjectFormatter} [10]
data = {array} [1]
0 = {\Food} [34]
new = false
deleted = false
modifiedColumns = {array} [0]
virtualColumns = {array} [1]
avg_rating = "5.0000"
id = 15
name = "Salát Caesar"
collReviews = {Propel\Runtime\Collection\ObjectCollection} [7]
index = {array} [2]
indexSplHash = {array} [2]
model = "Review"
fullyQualifiedModel = "\Review"
formatter = null
data = {array} [2]
0 = {\Review} [14]
new = false
deleted = false
modifiedColumns = {array} [0]
virtualColumns = {array} [0]
user_id = 1
food_id = 15
rating = 3
aFood = {\Food} [34]
aUser = null
alreadyInSave = false
reviewThumbsUpsScheduledForDeletion = null
1 = {\Review} [14]
new = false
deleted = false
modifiedColumns = {array} [0]
virtualColumns = {array} [0]
user_id = 3
food_id = 15
rating = 5
aFood = {\Food} [34]
aUser = null
alreadyInSave = false
reviewThumbsUpsScheduledForDeletion = null
*Propel\Runtime\Collection\Collection*pluralizer = null
collReviewsPartial = false
alreadyInSave = false
reviewsScheduledForDeletion = null
*Propel\Runtime\Collection\Collecti4
問題是平均評分不正確。 在virtualColumns中,您可以看到avg_rating字段,其值為“ 5.0000”。 但是,當您看上去較低時,您實際上可以看到該食物有2條評論的評分分別為3和5,因此平均值應為“ 4.0000”。
問題出在哪兒? 為什么這不能正常工作?
您當前正在對審閱表進行左聯接。 左連接將導致返回幾行(每條評論一個)。 對於返回的每一行,只有一個評論,因此“平均”將與該行的評論分數相同。 按平均值分組不會做很多事情,只會將分數完全相同的評論分組,這不是您要查找的內容。
您應該先按食物ID分組。 然后,您將可以對每個食品獲得一行,並獲得平均評分。
$food = FoodQuery::create()
->filterById(15) // constant for testing purposes only
->groupById()
->leftJoinWithReview()
->withColumn("AVG(review.rating)", "avg_rating")
->find();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.