2016-01-11 84 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