我遇到了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但没有运气。
提前致谢!
答案 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点,我应该在床上。