У меня есть 4 таблицы, а именно:
user
vip
group
group_vip
Каждый пользователь принадлежит к нулю или нескольким группам.
Vip - это таблица, содержащая столбец user_id
, который сопоставляет каждый vip.id
с user.id
.
group_vip
является таблицей ассоциации:
group_vip = Table('group_vip', MetaData,
Column('group_id', Integer, ForeignKey('group.id')),
Column('vip_id', Integer, ForeignKey('user.id'))
)
В поле «Пользователь» группа связывается путем построения отношения:
vip_groups = relationship("Group", secondary=group_vip, back_populates="vips")
У меня тогда есть следующееquery:
query = db.session.query().\
join(User, User.id == vip.user_id).\
outerjoin(group_vip, group_vip.c.vip_id == vip.user_id).\
outerjoin(Group, Group.id == group_vip.c.group_id).distinct()
query = query.order_by().all()
Из-за поведения по умолчанию sqlalchemy будет дедуплицировать записи на основе первичного ключа при выполнении базового SQL, возвращаемый результат должен иметь эффект group_by (vip.user_id) и поэтому возвращаетстолько уникальных строк, сколько в таблице vip
.
Таким образом, этот запрос возвращает, скажем, 15 строк, что является количеством записей в Vip.
Однако, когда я сортируюзапрос с Group.name
,
query = query.order_by(Group.name.desc()).all()
или
query = query.order_by(Group.name.asc()).all()
Возвращенное количество строк равно 12 и 10 соответственно. Почему итоговое число отличается от order_by для внешнего столбца?