首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将最大和最小计算移动到子查询中,以保留外部查询中的完整结果集。

将最大和最小计算移动到子查询中,以保留外部查询中的完整结果集。
EN

Database Administration用户
提问于 2019-03-07 09:07:23
回答 1查看 130关注 0票数 1

简单地说,查询的目的是根据它的分数列出所有的帖子,根据日期、视图和评分的计算分数来计算。

查询的问题是,它只给出1行结果,而不是显示所有的帖子。

我认为问题在于使用MAX()和MIN()而不将其与用于获取评级和视图之和的左侧联接查询分离。

MCVE http://sqlfiddle.com/#!9/70d1ec/1

代码语言:javascript
复制
SELECT
          p.id
         , p.date
         , p.title
         , r.module
         , r.module_id
         , IFNULL(v.total_views,0)  AS views
         , r.total_rating           AS rating

     #the following formula calculates the Score 10*(MAX(points)-(points))/(MAX(points)-MIN(points))

    , round((round(10-(((PD.MaxDate-p.date)/(PD.MaxDate-PD.MinDate))*10), 3) + round(10-(((MAX(v.total_views)-v.total_views)/(MAX(v.total_views)-MIN(v.total_views)))*10), 3) + round(10-(((MAX(r.total_rating)-r.total_rating)/(MAX(r.total_rating)-MIN(r.total_rating)))*10), 3))/3, 3) AS Score


  FROM  posts p

  LEFT  JOIN ( SELECT ra.module_id
              , ra.module   AS module
              , SUM(ra.ilike)    AS total_rating
           FROM rates ra
          WHERE ra.module = 'posts'
          GROUP
             BY ra.module_id
       ) r ON r.module_id = p.id

  LEFT  JOIN ( SELECT pv.post_id
              , SUM(1)    AS total_views
           FROM posts_views pv
          GROUP
             BY pv.post_id
       ) v ON v.post_id = p.id

   JOIN (SELECT MIN(date) AS MinDate, MAX(date) AS MaxDate FROM posts) PD


    ORDER BY Score DESC
EN

回答 1

Database Administration用户

发布于 2019-03-07 09:40:36

由于SELECT子句中有聚合函数,所以需要指定将它们应用于哪些组。如果你加上:

代码语言:javascript
复制
GROUP BY   p.id
 , p.date
 , p.title
 , v.total_views
 , r.total_rating
 , r.module
 , r.module_id

在查询ORDER之前,您将得到每个这样的组1行。

如果没有GROUP BY子句,MySQL将随机为您选择1行。在较早的MySQL版本中,这是一个众所周知的错误。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/231538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档