Mysql子查询字段未知

时间:2018-01-07 16:27:42

标签: mysql

我看过很多帖子都有这方面的解决方案但这在我的情况下不起作用。我究竟做错了什么? - 这给了我每个用户得分的总和,这是第一部分。(聚合数据) The Query result

SELECT user_id, sum(score) as total_user_score
FROM (
   SELECT comments_proper.user_id, comments_proper.score
   FROM assignment_2.comments_proper
) AS rsch 
GROUP BY user_id;

但是,我只想要包含最小和最高分数值的2条记录。

2 个答案:

答案 0 :(得分:0)

在你的查询中你有一些sintax问题和聚合结果的计算过于复杂..在cp1。*结果你得到cp2中的min相关值。* max相关。

如果您需要同一行的最小和最大行的所有结果,您可以根据汇总结果使用几个内部联接

select cp1.* , cp2.*
from ( SELECT  cp.user_id, sum(cp.score), min(cp.score) min_score, max(cp.score) max_score
              FROM assignment_2.comments_proper cp
              group by cp.user_id ) t 
inner join assignment_2.comments_proper cp1 on cp1.user_id = t.user_id 
            and cp1.score = t.min_score
inner join assignment_2.comments_proper cp2 on cp2.user_id = t.user_id 
          and cp2.score = t.max_score

否则,如果您希望结果分为两行,一行为min,另一行为max

  select 'min' , cp1.*
  from (  SELECT  cp.user_id, sum(cp.score), min(cp.score) min_score, max(cp.score) max_score
              FROM assignment_2.comments_proper cp
            group by cp.user_id ) t 
  inner join assignment_2.comments_proper cp1 on cp1.user_id = t.user_id 
            and cp1.score = t.min_score
  union 

  select 'max' , cp2.*
  from (  SELECT  cp.user_id, sum(cp.score), min(cp.score) min_score, max(cp.score) max_score
              FROM assignment_2.comments_proper cp
            group by cp.user_id ) t 
  inner join assignment_2.comments_proper cp2 on cp2.user_id = t.user_id 
          and cp2.score = t.max_score

答案 1 :(得分:0)

  

我做错了什么?

亲爱的,从哪里开始。

  

我看了很多帖子

你本来应该注意哪些人得到了投票和得到了很好的答案,而且这些答案被投票/关闭了。前者将包括表结构,输入和预期输出的示例。毫无疑问的问题。

  

我只想要2条记录

来自源数据集还是聚合数据集?

后者是一个稍微棘手的问题,已经在SO上多次询问和回答,有多种解决方案具有不同的性能特征。甚至还有一个chapter in the manual涵盖了这个问题。该链接的当前内容使用子查询来标识最小/最大值,该值替换解释the max-concat trick的文档的早期版本,但也可以使用变量来识别子查询中的正确caddidate行或使用排序。

然而,您在此处向我们展示的SQL与解决您描述的问题几乎无关,而且非常写得不好。

我不会提供每个解决方案的示例,但这将解决您的问题......

 SELECT user_id, SUM(score)
 FROM assignment_2.comments_proper
 GROUP BY user_id
 ORDER BY SUM(score) 
 UNION 
 SELECT user_id, SUM(score)
 FROM assignment_2.comments_proper
 GROUP BY user_id
 ORDER BY SUM(score) 

<强>更新 我没有测试过上面的内容。我测试了这个:

SELECT * 
FROM (
  SELECT user_id, SUM(score)
  FROM assignment_2.comments_proper
  GROUP BY user_id
  ORDER BY SUM(score)  LIMIT 0,1
) as lowest
UNION ALL
SELECT *
FROM (
  SELECT user_id, SUM(score)
  FROM assignment_2.comments_proper
  GROUP BY user_id
  ORDER BY SUM(score) DESC LIMIT 0,1
 ) as highest