2013-02-16 92 views
0

我想這是一件非常簡單的事情,但我找不到解決的辦法。這是我的問題;未知的列錯誤

SELECT A.*,MAX(A.id) as X 
FROM A 
INNER JOIN B ON(B.id=A.id) 
WHERE B.y > IF(X < 75, 0, 100) 

mysql上升錯誤,指出'X'列未知。我不想在SELECT MAX(A.id) from A的if子句中替換'X',因爲它會顯着減慢查詢速度,因爲我認爲它在B.y之間的每個值比較都會查詢SELECT MAX(A.id) from A。如果這種方法是不可能實現的,那麼我不得不調用兩個不同的查詢,先獲得最大標量值,然後將其放入上面的查詢中。我想知道它是否可以在單個查詢中解決。

類似的問題被問,但它似乎還沒有到解決: https://stackoverflow.com/questions/9052196/mysql-error-1054-unknown-column-on-clause

是否與作用域或類似的東西有關?

+0

請詳細說明一下(最好是在你的問題中)你想做什麼。這可能有助於找到解決問題的適當解決方案。 – 2013-02-16 13:21:53

回答

2

您不能在WHERE子句中使用別名。您將需要使用完整的表達式,或者使用HAVING。我會嘗試兩種,看看哪一種能提供最好的表演。

1

試試這個:

SELECT A.*,MAX(A.id) as X 
FROM A 
INNER JOIN B ON(B.id=A.id) 
HAVING B.y > IF(MAX(A.id) < 75, 0, 100) 

@ andryi米是正確的。該查詢甚至沒有編譯。

編輯:下面是一個相當不好的解決方案,但我認爲它會工作。敢肯定它可以改進:

SELECT A.* 
FROM A 
INNER JOIN B ON(B.id=A.id) 
WHERE B.y > IF((SELECT MAX(A.id) FROM A INNER JOIN B ON (B.id=A.id)) < 75, 0, 100) 

我重複第一查詢WHERE子句中得到最高id只在表AB之間的匹配。

+0

請嘗試解釋你做過什麼 – rohitarora 2013-02-16 13:09:21

+1

這[不會編譯](http://sqlfiddle.com/#!2/f0fc5/1)。 HAVING無法引用既不合並也不在GROUP BY中的列。由於沒有明確的* GROUP BY,HAVING根本不可以引用非聚合列(來自'A'或'B')。 – 2013-02-16 13:11:25

+1

@ andriy-m:是的,你說得對。這很容易成爲事實。在它上面工作。 – 2013-02-16 13:17:14