async def get_user(id: UUID4, db: AsyncSession) -> dict:
query = select(user_table, func.count(distinct(list_table.c.id)).label('list_count'), func.count(distinct(follower_table.c.follower_id)).label('follower_count'), func.count(distinct(passed_game_table.c.game_id)).label('passed_game_count')).join( follower_table, onclause=follower_table.c.user_id==user_table.c.id).join(list_table, onclause=list_table.c.owner_id==user_table.c.id).join(passed_table, onclause=passed_table.c.user_id==user_table.c.id).join(passed_game_table, onclause=passed_game_table.c.list_id==passed_table.c.id).group_by(user_table).where(user_table.c.id == id)
result = await db.execute(query)
print(result.all())
return result.all()
大家好,有一个功能可以显示特定用户的订阅数、列表数和游戏数,但是如果用户至少没有某样东西,那么就不会显示任何结果,而sql查询显示0,如果有的话根本失踪了。必须显示用户,无论他的订阅者是零还是100。我使用sqlalchemy 2.0

与您使用 提供的 SQL 代码不同,这些方法生成
LEFT JOIN的代码形成连接,这完全对应于您描述的有关缺少记录的行为。也许您正在使用的库包含一些方法,例如,使用它们。->join()JOIN/INNER JOINleftJoin()然而,所选择的查询策略似乎并不是特别有效,因为为了计算关注者的数量等。您正在构建一个遍历行的查询,从而增加结果数据集。也就是说,您获取
1*L*F*G行,然后开始计算唯一的行。在这种情况下,例如,对于列表,每个唯一值将重复F*G一次。这种情况下,使用关联子查询效率更高,原则上不会有表的乘积,也不
ditinct需要分组。此外,对于此类查询(无论此查询或您的版本),必须在进行
user_id, owner_id过滤的列和其他列上有索引。一般来说,如果您为这些表创建了外键,那么索引就会自动创建