2012-03-17 62 views
2

我在使用不同屬性的3個表格中查詢SQL語句時遇到了一些問題。下面是我想在他們每個人的查詢表和屬性:具有不同表格的三個不同表格的SQL查詢

news_stories - 時間,標題

per_minute_quotes - security_id,時間戳,last_price

證券 - 名稱,id_bb ,編號

我想要做的是從證券表中檢索證券名稱,id,從* news_stories *表中找到與該證券相對應的頭條新聞,並找到last_price fo從per_minute_quotes表中讀取該文章的同時安全性。

這是否有意義?請看看我已經設法做到如此遙遠......

SELECT DISTINCT 
    `news_stories`.`time`  
    , `securities`.`name`  
    , `adjusted_daily_quotes`.`security_id` 
    , `news_stories`.`headline` 
    , `securities`.`id_bb` 
    , `securities`.`id` 
FROM 
    `schema`.`adjusted_daily_quotes` 
    , `schema`.`securities` 
    , `schema`.`news_stories` 
WHERE ((`adjusted_daily_quotes`.`security_id`) = '498' 
    AND (`securities`.`id`) = '498' 
    AND (`securities`.`id_bb`) LIKE '267%' 
    AND (`news_stories`.`headline`) LIKE '%:267') 
LIMIT 0,50; 

這將基本上做我的查詢的第一部分,即。它與last_price沒有關聯。這是我在嘗試這樣做:

SELECT DISTINCT 
    `news_stories`.`time`  
    , `securities`.`name`  
    , `per_minute_quotes`.`security_id` 
    , `news_stories`.`headline` 
    , `securities`.`id_bb` 
    , `securities`.`id` 
    , `per_minute_quotes`.`timestamp` 
    , `per_minute_quotes`.`last_price` 
FROM 
    `schema`.`per_minute_quotes` 
    , `schema`.`securities` 
    , `schema`.`news_stories` 
WHERE ((`per_minute_quotes`.`security_id`) = '498' 
    AND (`securities`.`id`) = '498' 
    AND (`securities`.`id_bb`) LIKE '267%' 
    AND (`news_stories`.`headline`) LIKE '%:267 HK' 
    AND (`per_minute_quotes`.`timestamp`) <= (`news_stories`.`time`)) 
LIMIT 0,5; 

然而,這個查詢返回由於某種原因,相同標題的5,都具有相同的時間。我真的很感謝幫助形成這個查詢。這與DISTINCT運算符有什麼關係?我試過使用GROUP BY,但沒有運氣。

在此先感謝!

回答

1

這可能是迄今爲止最簡單的方法來做到/解釋它,儘管還有其他方法。

SELECT 
    s.name 
    , s.id 
    , ns.headline 
    , pmq.last_price 
FROM 
    securities s 
JOIN 
    news_stories ns 
     ON ns.headline LIKE '%:267 HK%' 
JOIN 
    (
    SELECT 
     MAX(per_minute_quotes.timestamp) ts 
     , per_minute_quotes.security_id 
    FROM 
     per_minute_quotes 
    WHERE 
     per_minute_quotes.security_id 
     AND per_minute_quotes.timestamp <= news_stories.time 
    GROUP BY 
     per_minute_quotes.security_id 
    ) t1 
JOIN 
    per_minute_quotes pmq 
     ON s.id = pmq.security_id 
     AND t1.ts = pmq.time 
WHERE 
    security.id = '498' 
LIMIT 0,5; 

要做到這一點最簡單的方法是使用連接,您正在做的,它只是一種不同的方式。你需要的另一件重要的事情就是加入聚合(MAX)。這個連接是一個子查詢,用於發現pmq的MAX時間戳,該時間戳小於或等於新聞報道發佈時的時間戳。你非常接近,只需要一點重構。

*我在這裏可能有錯誤,因爲我在記事本中輸入並複製並粘貼...現在是凌晨4點,我應該躺在牀上。

+0

非常感謝你的迴應Michael!不幸的是,當我運行它時,我的數據庫軟件給我「錯誤代碼:1146表'per_minute_quotes.security_id'不存在」。我花了很長時間試圖找出問題所在,但似乎找不到它。你知道什麼可能是錯的嗎? 這裏是代碼:http://pastebin.com/RxEehVX5 – Philip 2012-03-17 10:00:18

+0

試試這個版本:http://pastebin.com/2WjY0M4Y – 2012-03-18 05:44:12

+0

仍然無法得到它的工作 - 我用你的代碼,但它給了錯誤。稍微編輯它以刪除錯誤(添加第16行),它已經運行了一小時,似乎永遠不會結束......我想這是交叉查詢3個表,但給出5行限制,它似乎很奇怪,它需要長。你有什麼想法嗎? http://pastebin.com/WZrYwMdd – Philip 2012-03-18 12:25:57