2011-06-01 58 views
3

想象一下这样的查询...我可以使用稍后在查询中选择的列吗?

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

正如你所看到的,我已经多次加hitsother_hits。我可以参考在查询的其他部分创建的total_hits列吗?

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

+0

有人能具有很强的SQL请注明,如果再选择会为这个工作...即: 选择'id', 'hits' +'other_hits' AS'total_hits' FROM'something' WHERE(选择'hits' +'other_hits'> 30); – stefgosselin 2011-06-01 03:00:04

回答

6

用途:

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

最早的MySQL允许列别名引用是GROUP BY条款;条款后支持参考(HAVING,ORDER 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 
+0

'HAVING'和'WHERE'是否一样? – alex 2011-06-01 02:52:02

+0

我认为HAVING只能用于分组列。 – 2011-06-01 02:53:56

+0

@alex:'HAVING'与'WHERE'类似 - 主要的区别之一是你不能在'WHERE'中使用聚合函数(IE:SUM,MIN/MAX,COUNT),但是你可以使用“HAVING”中的聚合。 – 2011-06-01 02:54:33

1

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

你可以试试:

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

您必须参考公式,而不是列名。在SELECT语句被评估之前,列名不会被评估,这是在WHERE语句之后。不幸的是,你会需要两次重复的语句像你这样做,除非你包的声明,如下所示:

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

通知性能问题,但在你的内心SELECT大干快上每一个项目进行评估。这可能会对您造成问题,也可能不会,这取决于您的桌子设计。

1

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

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

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

0

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

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

这有额外的好处是能够索引非常快速检索与查询中的计算列。

+0

这不是必要的,但计算列是一个选项 - 视图可以提供相同的功能,但不需要触发器等。 – 2011-06-01 02:58:12

相关问题