2012-04-08 32 views
0

我想寫一個連接另一個表的查詢,但在這種情況下,我需要使用子查詢中左表中某一列的值。這樣做,我收到一個錯誤,指出mySQL無法找到具有這樣一個名稱的列。使用左表中的值連接兩個表

首先,這裏是我的查詢引用兩個表(t1和t2)(@Category是從我的程序底塗參數):

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, SQ.pointsValue 
FROM table1 t1 
LEFT OUTER JOIN (
    SELECT incID, person, IF(t1.sortBy=0, max(points), min(points)) pointsValue 
    FROM table2 
    GROUP BY incID 
) SQ ON SQ.incID = t1.incID 
WHERE [email protected] 
ORDER BY t1.name ASC 
LIMIT 0 , 30 

現在,當我執行這個查詢,這裏是返回的錯誤:#1054 - '字段列表'中的未知列't1.sortBy'

如果我用0 = 0替換t1.sortBy = 0,查詢執行得很好,所以它看起來像我只是似乎混淆了mySQL如何執行其操作順序?

是否有人可以澄清mySQL如何在這樣的查詢上執行操作的順序以及如何解決此問題?

+0

錯誤表示'table1'中沒有'sortby'列。 – 2012-04-08 01:23:53

+0

@ user1110302問題在圓括號內 - 爲什麼不把這部分移動到外部查詢? IF(t1.sortBy = 0,max(points),min(points))pointsValue – McGarnagle 2012-04-08 01:26:43

回答

1

您無法在派生表中引用外部表。您需要將IF邏輯向外移動:

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, 
     IF(t1.sortBy=0, maxPoints, minPoints) pointsValue 
FROM table1 t1 
LEFT OUTER JOIN (
    SELECT incID, person, max(points) maxPoints, min(points) minPoints 
    FROM table2 
    GROUP BY incID 
) SQ ON SQ.incID = t1.incID 
WHERE [email protected] 
ORDER BY t1.name ASC 
LIMIT 0 , 30 
+0

此時,如果第二個查詢的第一個查詢的值爲t1.sortBy,而不是第二個查詢的效率更高有mySQL拉兩個表,然後做邏輯? – user1110302 2012-04-08 01:31:52

+0

取決於數據庫引擎的優化。我相信,如果有30條記錄的限制,那麼在IF中嵌套的最小和最大子查詢會更快,但我之前錯了:-)然後,如果有一個索引(incID,person),應該快足夠。 – 2012-04-08 02:04:12

+0

甜!感謝您的幫助,我非常感謝! :) – user1110302 2012-04-08 03:08:20