【问题标题】:outerjoin which returns all joined rows in right table if at least one matches a condition如果至少有一个匹配条件,则外连接返回右表中的所有连接行
【发布时间】:2022-01-18 03:33:10
【问题描述】:

我有两个mysql表,

class Item(Base):
    id = Column(BigInteger, primary_key=True)
    updated_at = Column(DateTime, nullable=False)

class ItemVariant(Base):
    id = Column(BigInteger, primary_key=True)    
    item_id = Column(BigInteger(), nullable=False, index=True)
    updated_at = Column(DateTime, nullable=False)

    @declared_attr
    def item(self):
        return relationship(
            'Item',
            lazy='select',
            uselist=False,
            primaryjoin=lambda: foreign(self.item_id) == remote(Item.id),
            backref=backref('variants', uselist=True)
        )

ItemVariants 不一定需要为每个 Item 都存在。我有意且明确地不想添加外键约束。

我想选择(item, [list of item_variants with item_variant.item_id == item.id]),item.updated_at > some_date 或任何一个item_variant.update_at > some_date。

类似的查询

session.query(
  *my_columns_with_aliases
).select_from(
  Item
).filter(
  or_(
    Item.updated_at > some_date,
    ItemVariant.updated_at > some_date
  )
).outerjoin(
  ItemVariant, ItemVariant.item_id == Item.id
)

不起作用,因为如果我有item_1 和var_1, var_2,并且只有var_1.updated_at 匹配条件,则var_2 将不会包含在查询结果中。

我也尝试过为过滤做第二个别名外连接(使用非别名表进行选择),但这会返回太多结果。

“如果至少有一个符合条件,则获取所有变体”是否有标准解决方案?

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    我把它分成两个查询并使用union_all。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2014-12-10
      • 2013-01-20
      相关资源
      最近更新 更多