想象一下這樣的查詢...我可以使用稍後在查詢中選擇的列嗎?
SELECT `id`,
`hits` + `other_hits` AS `total_hits`
FROM `something`
WHERE `hits` + `other_hits` > 30
正如你所看到的,我已經多次加hits
和other_hits
。我可以參考在查詢的其他部分創建的total_hits
列嗎?
我試過了,我得到了1054:未知列在where子句。
想象一下這樣的查詢...我可以使用稍後在查詢中選擇的列嗎?
SELECT `id`,
`hits` + `other_hits` AS `total_hits`
FROM `something`
WHERE `hits` + `other_hits` > 30
正如你所看到的,我已經多次加hits
和other_hits
。我可以參考在查詢的其他部分創建的total_hits
列嗎?
我試過了,我得到了1054:未知列在where子句。
用途:
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
'HAVING'和'WHERE'是否一樣? – alex 2011-06-01 02:52:02
我認爲HAVING只能用於分組列。 – 2011-06-01 02:53:56
@alex:'HAVING'與'WHERE'類似 - 主要的區別之一是你不能在'WHERE'中使用聚合函數(IE:SUM,MIN/MAX,COUNT),但是你可以使用「HAVING」中的聚合。 – 2011-06-01 02:54:33
您不能使用WHERE子句來引用列別名。
你可以試試:
SELECT t.*
FROM (
SELECT `id`, `hits` + `other_hits` AS `total_hits`
FROM `something`) t
WHERE t.`total_hits` > 30
您必須參考公式,而不是列名。在SELECT語句被評估之前,列名不會被評估,這是在WHERE語句之後。不幸的是,你會需要兩次重複的語句像你這樣做,除非你包的聲明,如下所示:
SELECT *
FROM (
SELECT `id`,
`hits` + `other_hits` AS `total_hits`
FROM `something`) as t
WHERE `total_hits` > 30
通知性能問題,但在你的內心SELECT大幹快上每一個項目進行評估。這可能會對您造成問題,也可能不會,這取決於您的桌子設計。
您可以在HAVING子句中使用計算的變量,因爲這是在select之後計算的。
SELECT `id`,
`hits` + `other_hits` AS `total_hits`
FROM `something`
GROUP BY `id`, `total_hits`
HAVING `total_hits` > 30
同樣,會出現性能問題,因爲在過濾之前將對整個表格進行計算。
在名爲total_hits的表中添加一列,然後定義INSERT and UPDATE triggers以在插入行時計算列值。然後你可以這樣做:
SELECT
`id`, `total_hits`
FROM `something`
WHERE `total_hits` > 30;
這有額外的好處是能夠索引非常快速檢索與查詢中的計算列。
這不是必要的,但計算列是一個選項 - 視圖可以提供相同的功能,但不需要觸發器等。 – 2011-06-01 02:58:12
有人能具有很強的SQL請註明,如果再選擇會爲這個工作...即: 選擇'id', 'hits' +'other_hits' AS'total_hits' FROM'something' WHERE(選擇'hits' +'other_hits'> 30); – stefgosselin 2011-06-01 03:00:04