查询以从多个连接表postgres获取最新信息

时间:2018-03-15 03:52:39

标签: sql postgresql greatest-n-per-group

我有3张桌子。股票有很多新闻文章和新闻文章可以参考1个或多个股票。这是使用Stock表,News表和Stock_News表建模的。

如何获得我提供的30个股票代码的最新新闻文章?什么指数会使这个效率最高?

我的新闻表包含idlinkpublished_at。 (在published_at,id主键上的索引)

我的股票表格有idsymbol。 (符号索引,id主键)

我的stock_news表格有stock_id news_id。 (每个单独和组合的索引)

目前我正在使用,但我想知道这是否是最佳方式

SELECT n.link, s.symbol, n.published_at FROM news n 
JOIN stock_news sn on n.id = sn.news_id 
JOIN stocks s on s.id = sn.stock_id where s.symbol in ('AAPL', 'GOOG' ... etc) 
ORDER BY n.published_at DESC;

某些演示数据的EXPLAIN查询显示:

 Sort  (cost=8.92..8.92 rows=1 width=115)
   Sort Key: n.published_at DESC
   ->  Nested Loop  (cost=3.50..8.92 rows=1 width=115)
         ->  Hash Join  (cost=3.45..7.51 rows=1 width=12)
               Hash Cond: (s.id = sn.stock_id)
               ->  Seq Scan on stocks s  (cost=0.00..4.05 rows=2 width=12)
                     Filter: ((symbol)::text = ANY ('{AAPL,GOOG}'::text[]))
               ->  Hash  (cost=2.67..2.67 rows=223 width=16)
                     ->  Seq Scan on stock_news sn  (cost=0.00..2.67 rows=223 width=16)
         ->  Index Scan using news_pkey on news n  (cost=0.05..1.40 rows=1 width=119)
               Index Cond: (id = sn.news_id)

1 个答案:

答案 0 :(得分:1)

如果您想要最新的,我会推荐distinct on

SELECT DISTINCT ON (s.symbol) n.link, s.symbol, n.published_at
FROM news n JOIN
     stock_news sn
     ON n.id = sn.news_id JOIN
     stocks s
     ON s.id = sn.stock_id 
WHERE s.symbol IN ('AAPL', 'GOOG' ... etc) 
ORDER BY s.symbol, n.published_at DESC;

对于性能,您需要索引:stocks(symbol, id)stock_news(stock_id, new_id)news(id)