Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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 SQLAlchemy |将一对多关系的连接结果限制为一行_Python_Mysql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python SQLAlchemy |将一对多关系的连接结果限制为一行

Python SQLAlchemy |将一对多关系的连接结果限制为一行,python,mysql,sqlalchemy,flask-sqlalchemy,Python,Mysql,Sqlalchemy,Flask Sqlalchemy,我有两个实体:项目和学生列表。 一个项目可以有许多学生名单 我正在尝试加入项目的学生列表,并根据学生列表的自定义顺序仅返回每个项目的第一行 尝试的子查询: _whens = {ProjectStatus.APPROVED: 1, ProjectStatus.REJECTED: 2, ProjectStatus.SUBMITTED: 3, None: 4} sort_order = case(value=StudentList.student_list_status_id,

我有两个实体:项目和学生列表。 一个项目可以有许多学生名单

我正在尝试加入项目的学生列表,并根据学生列表的自定义顺序仅返回每个项目的第一行

尝试的子查询:

_whens = {ProjectStatus.APPROVED: 1, ProjectStatus.REJECTED: 2, 
          ProjectStatus.SUBMITTED: 3, None: 4}
sort_order = case(value=StudentList.student_list_status_id, whens=_whens)

return self._session.query(StudentList).
        filter(StudentList.student_list_id==Project.project_id)
       .order_by(sort_order).limit(1).subquery()
上面我定义了基于学生列表状态id的自定义排序。该函数返回子查询,然后我尝试将其加入下面的项目outerquery(学生列表子查询指的是上面返回的内容):

下面是相关的SQL输出

FROM project 
LEFT OUTER JOIN (SELECT student_list.project_id AS project_id, 
 student_list.student_list_id AS student_list_id
 FROM student_list, project
 WHERE project.project_id = student_list.project_id 
 ORDER BY CASE student_list.student_list_status_id WHEN 102 THEN 1 
 WHEN 105 THEN 2 WHEN 101 THEN 3 WHEN NULL THEN 4 END
 LIMIT 1) AS anon_1 ON anon_1.project_id = project.project_id
我使用的是mySQL,所以(不同的)解决方案将无法工作,行数/分区解决方案也无法工作


我似乎在这里提出了同样的问题

最终解决了这个问题。希望这能帮助其他人解决使用SQLAlchemy和mySQL自定义组排序时的第一个n-per-group问题

首先,我有一个函数,它返回项目最高优先级的一个学生列表状态id(因此是过滤器)

与上面查询中的学生列表状态id(别名为ps)相关的I join项目状态添加到项目中。然后,我可以根据我的目标项目状态名称进行排序

self._session.query(models.Project)
        .filter(models.Project.project_year == year)
        .join(ps, ps.project_status_id==student_list_subq)
        .all()
请注意,student_list_subq是指上面的create_student_list_subquery函数的结果。

我也有类似的问题。 解决方法是使用炼金术方法:

subquery = select([student_list.c.project_id, student_list.c.student_list_id])\
               .where(student_list.c.project_id == project.project_id)\
               .limit(1)\
               .lateral('students')
query = select([project.c.project_name, subquery.c.project_id, subquery.c.student_list_id])\
               .select_from(project.join(subquery))

self._session.query(models.Project)
        .filter(models.Project.project_year == year)
        .join(ps, ps.project_status_id==student_list_subq)
        .all()
subquery = select([student_list.c.project_id, student_list.c.student_list_id])\
               .where(student_list.c.project_id == project.project_id)\
               .limit(1)\
               .lateral('students')
query = select([project.c.project_name, subquery.c.project_id, subquery.c.student_list_id])\
               .select_from(project.join(subquery))