我很难优化我的SQLAlchemy查询。我的SQL知识非常基础,我无法从SQLAlchemy文档中获得所需的知识。
假设以下非常基本的一对多关系:
class Parent(Base):
__tablename__ = "parents"
id = Column(Integer, primary_key = True)
children = relationship("Child", backref = "parent")
class Child(Base):
__tablename__ = "children"
id = Column(Integer, primary_key = True)
parent_id = Column(Integer, ForeignKey("parents.id"))
naughty = Column(Boolean)
我怎么能:
(Parent, count_of_naughty_children, count_of_all_children)
每个父母的元组?经过相当长的搜索时间后,我发现了如何分别查询这些值:
# The following returns tuples of (Parent, count_of_all_children):
session.query(Parent, func.count(Child.id)).outerjoin(Child, Parent.children).\
group_by(Parent.id)
# The following returns tuples of (Parent, count_of_naughty_children):
al = aliased(Children, session.query(Children).filter_by(naughty = True).\
subquery())
session.query(Parent, func.count(al.id)).outerjoin(al, Parent.children).\
group_by(Parent.id)
我试图以不同的方式将它们组合在一起,但没有设法得到我想要的。
我猜想此查询将基于上一个查询,并按顽皮/所有比率进行过滤。
任何帮助表示赞赏。
编辑: 感谢Antti Haapala的帮助,我找到了第二个问题的解决方案:
avg = func.avg(func.coalesce(Child.naughty, 0)) # coalesce() treats NULLs as 0
# avg = func.avg(Child.naughty) - if you want to ignore NULLs
session.query(Parent).join(Child, Parent.children).group_by(Parent).\
having(avg > 0.8)
它找到子naughty
变量的平均值,将False和NULL视为0,将True视为1。在MySQL后端进行了测试,但也应该适用于其他变量。
在count()
SQL aggretate功能是相当简单的; 它为您提供每个组中非空值的总数。考虑到这一点,我们可以调整您的查询以为您提供适当的结果。
print (Query([
Parent,
func.count(Child.id),
func.count(case(
[((Child.naughty == True), Child.id)], else_=literal_column("NULL"))).label("naughty")])
.join(Parent.children).group_by(Parent)
)
产生以下sql:
SELECT
parents.id AS parents_id,
count(children.id) AS count_1,
count(CASE WHEN (children.naughty = 1)
THEN children.id
ELSE NULL END) AS naughty
FROM parents
JOIN children ON parents.id = children.parent_id
GROUP BY parents.id
问题内容: 我正在尝试在单个查询中计算两列,但结果却为medcount和uploadcount吐出了相同的值。有什么建议? 问题答案: 使用:
我想知道如何编写这个查询。 我知道这个实际的语法是假的,但它会帮助你理解我想要什么。我需要它的这种格式,因为它是一个大得多的查询的一部分。 我需要这所有返回在一个查询。 此外,它需要在一行中,因此以下操作将不起作用:
问题内容: 我有几个查询,下面详述。我希望能够运行一个同时返回两个计数的SQL查询,这可能吗? 1。 2。 到目前为止,我仅在搜索中找到MSSQL特定的解决方案。 问题答案: 如果您单行需要它们: (无论如何,Thilo的GROUP BY方法都是更好的通用解决方案。) 编辑: 我已经删除了。我已经忘记了为什么我从不使用它。
我现在在大学学习数据库,在我的项目中,我有3个表:、和 联赛(leagueId,leagueName) 团队(teamId,teamName) 具有(leagueId,teamId,year)
问题内容: 我目前有一个表,用于存储大量项目的统计数据,例如视图,下载,购买等。为了对每个项目进行一次操作计数,我可以使用以下查询: 这给了我所有的内容以及他们的看法。然后,我可以将其他变量的“视图”更改为“购买”或“下载”。但是,这意味着对数据库的三个单独的调用。 一口气拿下所有三个都可以吗? 问题答案: 将返回一个表, 其中每个item_id和operation一行一行 ,包含三列:item_
问题内容: 我想知道如何编写此查询。 我知道这个实际的语法是虚假的,但是它将帮助您理解我想要的。我需要这种格式,因为它是更大查询的一部分。 我需要所有这些都在一个查询中返回。 此外,它必须排成一排,因此以下内容将不起作用: 问题答案: 您可以将语句与聚合函数一起使用。这与某些RDBMS中的函数基本相同: