如何查询多个表中的数据并按时间排序?

时间:2015-04-12 05:16:46

标签: sql postgresql sqlalchemy

我想向用户展示一个Feed,它会合并两种不同类型的帖子,每个帖子都有不同的架构。似乎联盟不会起作用,因为他们有不同的专栏。我使用postgres和sqlalchemy

我正在考虑从table1中获取条目,然后从table2中获取条目,合并它们,然后按日期排序将是非常低效的。

编辑:

我希望能够查询帖子和图片列表,并按created_at排序。

帖子表和图片表:

Post
    title
    body
    created_at
    ...many more


Image
    img_url
    caption
    created_at
    ...many more

1 个答案:

答案 0 :(得分:1)

一个选项:

SELECT created_at
FROM (
    SELECT created_at
    FROM Post
    UNION ALL
    SELECT created_at
    FROM Image
)
ORDER BY created_at

请注意,这也可以在没有子查询的情况下完成,但我发现这种方式更清晰,并且可以更方便地添加过滤器。

从技术上讲,上面的查询与当前形式相同:

SELECT created_at
FROM Post
UNION ALL
SELECT created_at
FROM Image
ORDER BY created_at

SQLAlchemy示例:

q1 = sess.query(SomeClass).filter(SomeClass.foo=='bar')
q2 = sess.query(SomeClass).filter(SomeClass.bar=='foo')

q3 = q1.union_all(q2).order_by('created_at')

具有共同祖先的具体示例(使用模型的推断版本):

class FeedItem(Base):
    id = Column(Integer, primary_key=True)

class Post(FeedItem):
    id = Column(Integer, ForeignKey('feed_item.id'), primary_key=True)
    title = Column(String(100))
    body = Column(Text())
    created_at = Column(DateTime())


class Image(FeedItem):
    id = Column(Integer, ForeignKey('feed_item.id'), primary_key=True)
    img_url = Column(String(200))
    caption = Column(Text())
    created_at = Column(DateTime())

feed_items = with_polymorphic(FeedItem, [Post, Image])
query = session.query(feed_items).order_by('created_at')