2011-07-23 151 views
1

假設權益有一個名爲TickerID的列。我想用equity.TickerID取代111。當我嘗試這樣做時,MySQL似乎無法解析範圍並返回未知列。這條SQL語句可以工作,但我需要爲每個代碼運行它。如果我能拿到一張全桌,那會很好。MySQL Complex Inner Join

SELECT Ticker, 
    IF(tbl_m200.MA200_Count = 200,tbl_m200.MA200,-1) AS MA200, 
    IF(tbl_m50.MA50_Count = 50,tbl_m50.MA50,-1) AS MA50, 
    IF(tbl_m20.MA20_Count = 20,tbl_m20.MA20,-1) AS MA20 
FROM equity 
INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA200,COUNT(Y.Close) AS MA200_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 0,200 
) AS Y 
) AS tbl_m200 
USING(TickerID) 

INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA50,COUNT(Y.Close) AS MA50_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 50 
) AS Y 
) AS tbl_m50 
USING(TickerID) 

INNER JOIN 
(SELECT TickerID,AVG(Y.Close) AS MA20,COUNT(Y.Close) AS MA20_Count FROM 
(
    SELECT Close,TickerID FROM equity_pricehistory_daily 
    WHERE TickerID = 111 
    ORDER BY Timestamp DESC LIMIT 0,20 
) AS Y 
) AS tbl_m20 
USING(TickerID) 
+0

難道你不能簡化你的問題到最小的尺寸?到其核心? – TMS

回答

0

這似乎是MySQL的一些錯誤或「功能」。許多人似乎有與外表超出範圍相同的問題。

反正...你可以創建檢索所需信息的功能:

DROP FUNCTION IF EXISTS AveragePriceHistory_20; 

CREATE FUNCTION AveragePriceHistory_20(MyTickerID INT) 
RETURNS DECIMAL(9,2) DETERMINISTIC 
RETURN (
    SELECT AVG(Y.Close) 
    FROM (
     SELECT Z.Close 
     FROM equity_pricehistory_daily Z 
     WHERE Z.TickerID = MyTickerID 
     ORDER BY Timestamp DESC 
     LIMIT 20 
    ) Y 
    HAVING COUNT(*) = 20 
); 

SELECT 
    E.TickerID, 
    E.Ticker, 
    AveragePriceHistory_20(E.TickerID) AS MA20 
FROM equity E; 

你會得到NULL,而不是-1。如果這是不可取的,你可以用IFNULL(...,-1)包裝函數調用。


解決此的另一種方式,是選擇,而不是使用LIMIT的時間框架。

SELECT 
    E.TickerID, 
    E.Ticker, 
    (
     SELECT AVG(Y.Close) 
     FROM equity_pricehistory_daily Y 
     WHERE Y.TickerID = E.TickerID 
     AND Y.Timestamp > ADDDATE(CURRENT_TIMESTAMP, INTERVAL -20 DAY) 
    ) AS MA20 
FROM equity E; 
+0

非常感謝您的回答。我很高興終於放下試圖讓列ID進入內部選擇。函數方法非常有趣,我之前沒有使用過,因此我將使用您的示例作爲模板進行實驗。我會看看第二種方法是否可行,但我的直覺本能說不,因爲假期和週末等市場非常不穩定。 – user805547