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;
5条答案
按热度按时间kpbpu0081#
不能,不能在select-list或WHERE子句中使用别名。只能在GROUP BY、HAVING或ORDER BY中使用别名。
也可以使用在子查询中定义的别名:
mpbci0fu2#
qpgpyjmq3#
我觉得这不是个好主意。如果你想做一个大的查询,最好不带子查询。如果需要,可以使用
COUNT(*)
和更大的函数,而不使用别名。我用别名和子查询进行了查询。花了大约一个小时!然后我复制了没有别名的查询。它下降到大约45分钟。在这种情况下,请忽略子查询。它不那么难,更漂亮,但它使您的查询速度更慢。
yhqotfr84#
我不知道你想做什么,但是在上面的解决方案中,你在别名表上运行子查询,这是没有效率的。
基本上,T是你的别名表,它返回带有计数的foo列,这是一条记录,对它使用SUM(foo)函数没有意义,因为它是一条记录。
简单的回答:
由于COUNT函数将返回相同的结果,无论您包含哪些NOT NULL字段作为COUNT函数参数(即:在括号内),你可以使用COUNT(1)来获得更好的性能。现在,数据库引擎将不必获取任何数据字段,而是只检索整数值1。
neskvpey5#
我在MySQL中通过创建一个自定义函数解决了这个问题。下面是函数:
下面是使用该函数的查询:
希望这能帮上忙。