如何从多个表中查询数据并按时间排序?
How can I query data from multiple tables and sort by time?
我想向用户展示一个 feed,它结合了两种不同类型的帖子,每一种都有不同的架构。工会似乎行不通,因为他们有不同的专栏。我正在使用 postgres 和 sqlalchemy
我正在考虑从 table1 中获取条目,然后从 table2 中获取条目,合并它们,然后按日期排序,效率非常低。
编辑:
我希望能够查询帖子和图片列表并按 created_at
排序。
帖子 table 和图片 table:
Post
title
body
created_at
...many more
Image
img_url
caption
created_at
...many more
一个选项:
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')
我想向用户展示一个 feed,它结合了两种不同类型的帖子,每一种都有不同的架构。工会似乎行不通,因为他们有不同的专栏。我正在使用 postgres 和 sqlalchemy
我正在考虑从 table1 中获取条目,然后从 table2 中获取条目,合并它们,然后按日期排序,效率非常低。
编辑:
我希望能够查询帖子和图片列表并按 created_at
排序。
帖子 table 和图片 table:
Post
title
body
created_at
...many more
Image
img_url
caption
created_at
...many more
一个选项:
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')