MySQL:在聚合函数中使用别名字段

czq61nw1  于 12个月前  发布在  Mysql
关注(0)|答案(5)|浏览(129)

我有一个类似这样的SQL语句:

SELECT COUNT(*) AS foo, SUM(foo) AS foo_sum FROM bar

但是MySQL不允许这样做,因为foo是一个别名。有人知道如何在SQL中实现这一点吗?

kpbpu008

kpbpu0081#

不能,不能在select-list或WHERE子句中使用别名。只能在GROUP BY、HAVING或ORDER BY中使用别名。
也可以使用在子查询中定义的别名:

SELECT foo, SUM(foo) AS foo_sum
FROM (
  SELECT COUNT(*) AS foo
  FROM bar
);
mpbci0fu

mpbci0fu2#

SELECT SUM(foo) as foo_sum
FROM 
(
    SELECT COUNT(*) AS foo
    FROM bar
    GROUP BY baz
)
qpgpyjmq

qpgpyjmq3#

我觉得这不是个好主意。如果你想做一个大的查询,最好不带子查询。如果需要,可以使用COUNT(*)和更大的函数,而不使用别名。
我用别名和子查询进行了查询。花了大约一个小时!然后我复制了没有别名的查询。它下降到大约45分钟。在这种情况下,请忽略子查询。它不那么难,更漂亮,但它使您的查询速度更慢。

yhqotfr8

yhqotfr84#

我不知道你想做什么,但是在上面的解决方案中,你在别名表上运行子查询,这是没有效率的。

SELECT foo 
FROM (SELECT COUNT(*) AS foo FROM employees) AS T;

基本上,T是你的别名表,它返回带有计数的foo列,这是一条记录,对它使用SUM(foo)函数没有意义,因为它是一条记录。
简单的回答:

SELECT Count(1) AS foo from employees;

由于COUNT函数将返回相同的结果,无论您包含哪些NOT NULL字段作为COUNT函数参数(即:在括号内),你可以使用COUNT(1)来获得更好的性能。现在,数据库引擎将不必获取任何数据字段,而是只检索整数值1。

neskvpey

neskvpey5#

我在MySQL中通过创建一个自定义函数解决了这个问题。下面是函数:

CREATE DEFINER=`root`@`localhost` FUNCTION `FN_GET_CANDIDATE_COUNT_BY_EMPLOYER_BOUNTY_ID`(
    P_employer_id INT,
    P_bounty_id INT,
    P_publish_id INT
) RETURNS int
    READS SQL DATA
BEGIN
    DECLARE V_candidate_count INT DEFAULT 0;
    SELECT COUNT(candidate_id) INTO V_candidate_count
    FROM bounty_candidates
    WHERE employer_id = P_employer_id AND bounty_id = P_bounty_id AND publish_id = P_publish_id AND ISNULL(accepted) = 0;
RETURN V_candidate_count;
END

下面是使用该函数的查询:

SELECT employer_id, bounty_id, publish_id, FN_GET_CANDIDATE_COUNT_BY_EMPLOYER_BOUNTY_ID(employer_id, bounty_id, publish_id) AS candidate_count,
bounty_title, bounty_description, bounty_offer, categories, closing_date
FROM bounty_candidates
WHERE candidate_id = 3;

希望这能帮上忙。

相关问题