Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按连接数对查询进行排序_Python_Mysql_Sql_Sqlalchemy - Fatal编程技术网

Python 如何按连接数对查询进行排序

Python 如何按连接数对查询进行排序,python,mysql,sql,sqlalchemy,Python,Mysql,Sql,Sqlalchemy,Parent和Child表与Parent\uuidForeignKey属性链接: 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)

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
循环用于声明
父对象。使用
random.randomint()
)时,每个
父项都链接到随机数目的子项:

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()
如何查询按多个链接的
子项对其排序的所有
父项
实体<“代码>父级”
“子级”
数量最多的应列在列表的第一位。我可以使用
order\u 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

这将为您的父母和子女提供按相关子女记录的最高计数排序的信息。

没有意识到MySQL不支持分析功能。您可能必须使用原始sql编写此代码:请参阅。祝你好运或者,如果可能的话,切换到postgres?
MySql
引发编程错误:(\u MySql\u exceptions.ProgrammingError)(1064,“您的SQL语法有错误;请查看与您的MySql服务器版本对应的手册,以获取正确的语法,将near'(PARTITION BY parents.uuid)用作第1行的父级、子级的非父级)[SQL:u'选择parents.uuid作为parents\u uuid,children.uuid作为children\u uuid,children.parent\u uuid作为children\u parent\u uuid,count(*)OVER(PARTITION BY parents.uuid)作为来自parents,children'的第1个\n