可以在WHERE子句中计算列别名吗?

时间:2009-10-22 10:09:17

标签: php mysql

首先,我不是MySQL查询的专家,我似乎找不到解决问题的方法。

示例:

SELECT SUM(IF(table1.col1<4,1,0)) AS score WHERE score>0 GROUP BY table1.col2

由于table1中不存在列分数,上述情况会出错。

这是我的解决方法:

SELECT SUM(IF(table1.col1<4,1,0)) AS score GROUP BY table1.col2

然后检查PHP中的每一行

if($row['score']>0){...

存在性能问题,因为我循环遍历我知道不需要的行,理想情况下我需要忽略查询中的那些行。

我的理解是,为表的每一行触发WHERE子句,而不是分组的行。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

Having支持列别名,因此您可以执行此操作:

SELECT SUM(IF(table1.col1<4,1,0)) AS score
GROUP BY table1.col2
HAVING score > 0

你可以简化它,因为你正在尝试计算col1&lt; 4:

SELECT COUNT(table1.col1) AS score
 WHERE table1.col1 < 4
GROUP BY table1.col2
HAVING score > 0

答案 1 :(得分:1)

在根据GROUP BY子句对行进行分组之前评估WHERE子句;因此,它不仅是您语法中的问题:score列在此上下文中毫无意义。它只能在评估组后计算,因此您的解决方案肯定是HAVING。

相关问题