mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
40 lines
No EOL
1.1 KiB
Markdown
40 lines
No EOL
1.1 KiB
Markdown
---
|
|
title: Using DISTINCT in Parent-Child Relationships
|
|
headline: How to get parent and most-recent child in a one-to-many relationship
|
|
tags: SQL, SQLAlchemy, Python
|
|
---
|
|
|
|
Let's say you have a model defined like this, with a Parent and a Child table:
|
|
|
|
```python
|
|
|
|
class Parent(Base):
|
|
__tablename__ = "parent"
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
|
|
childs: Mapped[List["Child"]] = relationship(back_populates="parent")
|
|
|
|
|
|
class Child(Base):
|
|
__tablename__ = "child"
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
parent_id: Mapped[int] = mapped_column(ForeignKey("parent.id"))
|
|
parent: Mapped["Parent"] = relationship(back_populates="children")
|
|
|
|
born_at: Mapped[datetime] = mapped_column()
|
|
```
|
|
|
|
I've tried many ways, with complex subqueries and the like, before finding out [the DISTINCT SQL statement](https://www.sqlitetutorial.net/sqlite-distinct/).
|
|
|
|
So, if you want to retrieve the parent with it's more recent child, you can do it like this:
|
|
|
|
```python
|
|
|
|
results = (
|
|
db.query(Parent, Child)
|
|
.join(Child)
|
|
.distinct(Parent.id)
|
|
.order_by(Parent.id, desc(Child.born_at))
|
|
.all()
|
|
)
|
|
``` |