我可以使用稍后在查询中选择的列吗?

时间:2011-06-01 02:44:01

标签: mysql sql mysql-error-1054

想象一下这个问题......

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 WHERE `hits` + `other_hits` > 30

如您所见,我已重复添加hitsother_hits。我可以参考我在查询的其他部分创建的total_hits列吗?

我试过了,我得到 1054:where子句中的未知列

5 个答案:

答案 0 :(得分:6)

使用:

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
HAVING `total_hits` > 30

最早的MySQL允许对列别名的引用是GROUP BY子句;支持引用后的子句(HAVINGORDER BY)。大多数其他数据库不支持在ORDER BY之前引用表别名,这通常需要使用派生表/内联视图:

SELECT t.id, t.total_hits
  FROM (SELECT `id`,
               `hits` + `other_hits` AS `total_hits`
          FROM `something`) t
 WHERE t.total_hits > 30

否则,您必须重用WHERE子句中的逻辑:

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 WHERE `hits` + `other_hits` > 30

答案 1 :(得分:1)

您不能使用WHERE子句来引用列别名。

您可以尝试:

SELECT t.*
FROM (
  SELECT `id`, `hits` + `other_hits` AS `total_hits`
  FROM `something`) t
WHERE t.`total_hits` > 30

答案 2 :(得分:1)

您必须参考公式,而不是列名。在评估SELECT语句之前,不会评估列名,这是在WHERE语句之后。不幸的是,除非你像这样包装语句,否则你将需要像你所做的那样重复两次语句:

SELECT *
FROM (
SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`) as t
 WHERE `total_hits` > 30

请注意性能问题,因为您的内部SELECT会在每个项目上进行评估。这可能会给您带来问题,也可能不会出现问题,具体取决于您的表格设计。

答案 3 :(得分:1)

您可以在HAVING子句中使用计算变量,因为这是在select之后计算的。

SELECT `id`,
       `hits` + `other_hits` AS `total_hits`
  FROM `something`
 GROUP BY `id`, `total_hits`
 HAVING `total_hits` > 30

同样,会出现性能问题,因为在过滤之前将对整个表进行计算。

答案 4 :(得分:0)

在名为total_hits的表中添加一列,然后定义INSERT and UPDATE triggers以计算插入行时的列值。然后你可以这样做:

SELECT
  `id`, `total_hits`
FROM `something`
WHERE `total_hits` > 30;

这样做的另一个好处是能够为查询中的计算列与非常快速的检索建立索引。