簡體   English   中英

如何按連接數對查詢進行排序

[英]How to sort query by connections number

Parent表和Child表通過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應在列表中的第一個。 我可以使用order_by()函數按uuid屬性排序:

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

但在這里,需要先計算孩子的數量。 如何按尚未計算的值排序?

您可以使用 partition by 和 count 函數,該函數將添加與其父母相關的每個孩子的計數。 然后您可以使用該列進行排序。

看起來像這樣:

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

它為您提供按相關子項記錄的最高計數排序的父項和子項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM