MySQL操作数应包含1列 - 如何克服

时间:2014-07-01 14:25:40

标签: mysql sql

我有以下MySQL代码:

SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) AS High,
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) 
FROM tresults_new GROUP BY company ASC LIMIT 1) AS Low
FROM tresults_new GROUP BY company DESC LIMIT 1

现在我理解为什么这会在标题中带回错误,因为我在子查询中带回了companyLow

我正在努力的是how在单个查询中同时返回HighLow(或者如果您更喜欢MaxMin)如果可能的话,我无法理解,以及如何实现它。

欢迎提出任何建议和反馈。

供参考,表格结构

company    q1     q2     q3
abc        5      6      2
abc        9      5      8
xyz        3      4      6
xyz        3      2      1
zyx        7      9      10

2 个答案:

答案 0 :(得分:1)

使用max和min函数应该有所帮助。我倾向于在S​​QL Server中工作,但对MySQL也是如此。

进一步澄清后更新

所以对我的回复发表评论之后。 OP发布和另一个回复。我摆弄了一下,这实际上应该让你得到你想要的东西。如果您只是这样做一次可能会夸大它,但如果您的数据集变大,这应该可以满足您的需求,并且仍然可以为您提供所需的最大值和最小值,这样您就可以了解最高和最低性能的公司。如果你想自己玩它,我也做了一个SQLFiddle - 要清楚我使用的是SQL Server,因为我在小提琴例子中比较熟悉,但对MySQL的任何修改都应该相对简单。

SELECT vals.company, vals.myval
FROM
(SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
     FROM tresults_new GROUP BY company
) vals
INNER JOIN
(
  SELECT max(myval) val
  FROM 
    (SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
     FROM tresults_new GROUP BY company
    ) s
  UNION
  SELECT min(myval) val
  FROM 
    (SELECT company, ((AVG (q1) + AVG(q2) + AVG(q3) ) / 3) as myval
     FROM tresults_new GROUP BY company
    ) s
) maxmin on maxmin.val = vals.myval

答案 1 :(得分:1)

我不认为你可以合理地避免两个查询,或者它将是一个子查询,让你没有好转。根据您的评论和您的示例查询,我们了解到您只对哪个公司的AVG(q1)+AVG(q2)+AVG(q3)值最高且哪个公司价值最低的公司感兴趣。在这种情况下,我只依赖于按此值排序的单个查询。第一行和最后一行将是您的答案。

SELECT company, val FROM
    (SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
    FROM tresults_new 
    GROUP BY company
    ORDER BY val DESC LIMIT 1) 
AS VAL_MAX

UNION

SELECT company, val FROM
    (SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
    FROM tresults_new 
    GROUP BY company
    ORDER BY val ASC LIMIT 1)
AS VAL_MIN

或只有一个没有LIMIT子句的查询,并获取第一行和最后一行。


警告:当然,写下这样的东西很有吸引力:

SELECT company, MIN(val), MAX(val) FROM 
    (SELECT company, AVG(q1) + AVG(q2) + AVG(q3) AS val
    FROM tresults_new 
    GROUP BY company)
AS values [GROUP BY company]

没有最后GROUP BY company,您将获得最大值但不是公司(此查询将被MySQL接受但被其他一些RDBMS拒绝,因为你需要明确的分组。)

所以添加GROUP BY,您只需获得相同的最小值和最大值,这样您就不会比内部查询更好。