【问题标题】:How can I query data from multiple tables and sort by time?如何从多个表中查询数据并按时间排序?
【发布时间】:2015-04-12 22:05:16
【问题描述】:

我想向用户展示一个将两种不同类型的帖子组合在一起的提要,每种帖子都有不同的架构。工会似乎行不通,因为它们有不同的列。我正在使用 postgres 和 sqlalchemy

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

编辑:

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

帖子表和图片表:

Post
    title
    body
    created_at
    ...many more


Image
    img_url
    caption
    created_at
    ...many more

【问题讨论】:

  • 根据示例显示您的表定义、一些示例数据和预期输出。
  • 添加了一个具体的例子

标签: sql postgresql sqlalchemy


【解决方案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')

【讨论】:

  • @kishinmanglani:是的,您需要在两者中具有相同的列。请注意,您可以像这样“伪造”列:SELECT ''::text AS some_column
  • 除了改变你的表结构以拥有共同的祖先之外,你能做的并不是很多。 SQLAlchemy 支持这一点相当容易:docs.sqlalchemy.org/en/latest/orm/… 请注意,如果可以的话,出于性能原因,您应该使用union_all :)
  • 在这种情况下,您正在寻找的是多态继承,这是一个相当复杂的事情要有效地完成,但 sqlalchemy 支持:docs.sqlalchemy.org/en/latest/orm/…
  • 或者更简单、具体的表继承:docs.sqlalchemy.org/en/latest/orm/…
  • @kishinmanglani:我添加了一个示例,说明如何使其工作
猜你喜欢
  • 1970-01-01
  • 2015-09-17
  • 2023-03-30
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多