2016-01-11 87 views
1

我目前正在尝试转换,我已经写进使用的SQLAlchemy转换成MySQL的烧瓶SQLAlchemy的

的功能的MySQL的声明

我有一个表Project,一个用于Likes。这些包含了喜欢的项目。我想要获得所有特定用户的项目并获得相应的计数。

这是MySQL:

SELECT project.id as id, project.name as name, 
    project.description as description, 
    project.user_id as user_id, 
    iFNULL(like_count,0) as like_count, 
    project.created_on 
    FROM milo.project LEFT JOIN (
     SELECT COUNT(*) as like_count, project_id 
      FROM milo.likes 
      GROUP BY project_id 
    ) counting 
ON counting.project_id = milo.project.id 
WHERE (milo.project.user_id = 1) 
ORDER BY project.created_on 

所以这个联接表Project通过查询创建的另一个表,计算该项目

这个查询获取Like计数的喜欢:

res = db.session.query(func.count(likes.Likes.project_id), project.Project) \ 
     .join(project.Project, (likes.Likes.project_id == project.Project.id)) \ 
     .group_by(likes.Likes.project_id) 

该查询获取用户项目:

user_projects = Project.query.filter_by(user_id=1).all() 

我得到这个最接近的,如下:

projects = db.session.query(func.count(Likes.project_id), Project) \ 
     .join(Project, (Project.id == Likes.project_id)) \ 
     .filter(Likes.user_id == user.id) \ 
     .group_by(Likes.project_id).order_by(Project.created_on.desc()) \ 
     .all() 

但这个问题是,如果一个项目没有喜欢,不退回!显然它也需要一个左连接,我在这里找不到。

任何人都可以帮助翻译这句话吗?

回答

0

我相信你在寻找outerjoin

所以

.join(Project, (Project.id == Likes.project_id)) \ 

成为

.outerjoin(Project, (Project.id == Likes.project_id)) 
+0

我不认为这是正确的,我希望有一个正确的加入,因为我想获得的所有项目,如果他们有一个像数,得到的是HTTP ://www.w3schools.com/sql/sql_join_right.asp外连接会给所有喜欢加项目http://www.w3schools.com/sql/sql_join_full.asp – redrubia

+0

我的不好。我认为select_from关键字可能会有帮助,但我没有任何使用它的经验。 http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.select_from –

+0

没问题。感谢您的尝试!会看看:) – redrubia