2011-06-01 59 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

相關問題