具有不同的三个不同表的SQL查询

时间:2012-03-17 07:13:04

标签: mysql sql distinct

我遇到了3个具有不同属性的表的SQL查询问题。以下是我要在每个表中查询的表和属性:

  

news_stories - 时间,标题

     

per_minute_quotes - security_id,timestamp,last_price

     

证券 - 名称,id_bb,id

我想要做的是从证券表中检索安全名称,id,从* news_stories *表中找到与该安全性相对应的标题(带有时间戳),并在同一时间找到该证券的last_price时间作为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 个答案:

答案 0 :(得分: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点,我应该在床上。