您有两个LEFT JOINS
:
您仍然会得到 行,只是未显示“ jane”,联接条件将其过滤掉,但LEFT JOIN
无论如何仍将行保留在结果中并追加NULL值。
您可以通过使用 和[INNER] JOIN
而不是LEFT JOIN
之间的solved
和来实现您想要的功能users
。手册:
如有必要,请使用括号来确定嵌套顺序。在没有括号的情况下,JOIN
s从左到右嵌套。
SELECT c.name AS cat_name, t.name AS task_name, u.name AS user_name
FROM task t
JOIN category c ON cat.id = t.category_id
LEFT JOIN
(solved s JOIN users u ON u.id = s.user_id AND u.name = 'luke') ON s.task_id = t.id
ORDER BY 1, 2, 3;
使用表名users
代替保留字
。user
假设users.name
定义为 或者您可以有多个名为“ luke”的用户。
如果(task.id, users.id)
insolved
定义为UNIQUE
或PRIMARY KEY
,则完全不需要DISTINCT
。
结果查询不仅正确,而且速度更快。
(贡献的@van) 这是假定Category
,Task
和User
被映射类,而solved
是实例Table
(如图代码示例只是一个关联表多对多):
user_name = 'luke'
q = (session.query(Category.name, Task.name, User.name)
.select_from(Task)
.join(Category)
.outerjoin(
join(solved, User,
(solved.c.user_id == User.id) & (User.name == user_name),
))
.order_by(Category.name, Task.name, User.name)
)