我希望执行以下SQL:
SELECT c.name, count(1)
FROM post p LEFT JOIN category_post cp ON (p.id = cp.post_id)
LEFT JOIN category c ON (cp.category_id = c.id)
WHERE 1=1
AND post.is_published = 1
GROUP BY c.name;
帖子包含0个或更多类别。这篇文章将返回每个类别的计数,包括未分类的帖子,因为我从post->类别开始LEFT JOIN,而不是相反,这不包括未分类的计数讯息。
在SQLAlchemy中,我可以使用以下内容获得解决方案的一部分,但它不会返回未分类帖子的数量,因为LEFT JOIN的方向错误:
from sqlalchemy.sql import func
q = session.query(Category.name, func.count(1)) \
.outerjoin(CategoryPost) \
.outerjoin(Post) \
.filter(Post.is_published == True) \
.group_by(Category.name)
由此生成的SQL是:
SELECT category.name AS category_name, count(1) AS count_1
FROM category LEFT OUTER JOIN category_post ON category.id = category_post.category_id
LEFT OUTER JOIN post ON post.id = category_post.post_id
WHERE post.is_published = 1
GROUP BY category.name
如果我能以某种方式改变JOIN子句中表格的顺序,或者甚至只是在保持相同顺序的情况下进行正确的加入,我就可以实现我的目标。
答案 0 :(得分:1)
session.query(Category.name, func.count(1)) \
.select_from(Post) \
.outerjoin(CategoryPost) \
.outerjoin(Category) \
...