对于外表中不存在的记录,average()值为默认值0

时间:2011-04-09 19:24:21

标签: mysql sql

  • SubscriptionMaster(subId,subLink)
  • AlertMaster(alertId,alertTitle,alertText,subId)
  • AlertDetails(alertId,userId,voteVal,userNote)
    • alertId是(F.K。)到AlertMaster

查询:

  SELECT alrt.alertid,
         alrt.alertTitle, 
         alrt.alertDetails, 
         alrt.alertDate, 
         alrt.alertURL,
         sub.subTitle,
         avg(dtl.avgVote) 
    FROM alertDetails dtl,
         ALERTMASTER alrt,
         SUBSCRIPTIONMASTER sub
   WHERE alrt.subId = 1 
     AND alrt.subId = sub.subId 
GROUP BY alertId 
ORDER BY alertDate DESC 
   limit 0,10;

alertMaster中有许多记录,其中有很多b在alertDetails中投票。 当我执行上述查询时,我得到 -0.2500 这些记录。有没有办法在那里得到0这样的记录?

1 个答案:

答案 0 :(得分:1)

您需要的是从AlertMaster到AlertDetails的左连接。但是,您的原始查询不包括AlertDetails与其他两个表相关的任何条件,也不知道从哪个表中找到大多数列,因为它们不包含表别名。此外,您应该不习惯使用逗号分隔语法,而应使用ISO Join语法。

最后,您尝试在AlertDate上订购,但它不包含在Group By子句中。这是MySQL的一个“功能”,应该放弃IMO。 SQL规范要求Select子句中的所有列都存在于Group By子句中,或者列包含在聚合函数中。因此,要么在alertDate上组,要么将其包装在聚合函数中。

Select A.alertid
    , Min( A.alertTitle ) As alertTitle
    , Min( A.alertDetails ) As alertDetails
    , Min( A.alertDate ) As alertDate
    , Min( A.alertURL ) As alertUrl
    , Min( S.subTitle ) As subTitle
    , Coalesce( Avg( D.avgVote ), 0 ) As avgVote
From AlertMaster As A
    Join SubscriptionMaster As S
        On S.subid = A.subId
    Left Join AlertDetails As D
        On D.alertId = A.alertId
Where A.subId=1 
Group By A.alertId
Order By alertDate DESC 
Limit 0,10;