如何按连接数排序查询

时间:2017-01-15 04:26:00

标签: python mysql sql sqlalchemy

ParentChild表与parent_uuid ForeignKey属性相关联:

from sqlalchemy.ext.declarative import declarative_base
import uuid

Base = declarative_base()
class Parent(Base):
    __tablename__ = 'parents'
    uuid = Column(String(64), primary_key=True, unique=True)
    def __init__(self):  
        self.uuid = uuid.uuid4()   

class Child(Base):
    __tablename__ = 'children'
    uuid = Column(String(64), primary_key=True, unique=True)
    parent_uuid = Column(String(64), ForeignKey('parents.uuid'))
    def __init__(self, parent_uuid=None):  
        self.uuid = uuid.uuid4()   
        self.parent_uuid = parent_uuid

for循环用于声明Parent个对象。使用random.randomint())每个parent都是随机数的子项链接:

for i in range(25):
    parent = Parent()
    session.add(parent)
    session.commit()
    parent_uuid = parent.uuid 
    for i in range(random.randint(0, 10)):
        child = Child(parent_uuid=parent_uuid)
        session.add(child)
        session.commit()

如何通过多个链接的Parent查询排序它们的所有Children个实体。 Parent编号最高的children应该是列表中的第一个。我可以使用uuid函数按order_by()属性进行排序:

session.query(Parent).order_by(desc(Parent.uuid)).all()

但在这里,需要首先计算孩子的数量。如何按尚未计算的值排序?

1 个答案:

答案 0 :(得分:1)

您可以使用分区依据,使用计数功能,该功能将添加与其父项相关的每个子项的计数。然后您可以使用该列按顺序排序。

看起来像这样:

from sqlalchemy import desc, func

query = session.query(Parent, Child, func.count().over(partition_by=Parent.uuid)
.label('children_count'))
.filter(Child.parent_uuid == Parent.uuid)
.order_by(desc('children_count'))
print(query)

将产生以下sql:

SELECT parents.uuid AS parents_uuid, children.uuid AS children_uuid,
children.parent_uuid AS children_parent_uuid, 
count(*) OVER (PARTITION BY parents.uuid) AS children_count
FROM parents, children
WHERE children.parent_uuid = parents.uuid ORDER BY children_count DESC

根据相关儿童记录的最高计数,为您提供父母和子女。