2012-03-17 39 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

相关问题