我有以下两张表:
用户
userid | email | phone
1 | some@email.com | 555-555-5555
2 | some@otheremail.com | 555-444-3333
3 | one@moreemail.com | 333-444-1111
4 | last@one.com | 123-333-2123
UserTag
id | user_id | tag
1 | 1 | tag1
2 | 1 | tag2
3 | 1 | cool_tag
4 | 1 | some_tag
5 | 2 | new_tag
6 | 2 | foo
6 | 4 | tag1
我想在SQLAlchemy中运行一个查询来连接这两个表,并返回没有标签“tag1”或“tag2”的所有用户。在这种情况下,查询应返回具有用户ID 2和3的用户。非常感谢任何帮助。
我需要与此查询相反:
users.join(UserTag, User.userid == UserTag.user_id)
.filter(
or_(
UserTag.tag.like('tag1'),
UserTag.tag.like('tag2')
))
)
我已经在这里工作了好几个小时,但最终总是会遇到错误的用户,有时甚至是所有用户。实现此目的的SQL查询也会有所帮助。我会尝试将其转换为SQLAlchemy。
答案 0 :(得分:1)
不确定在SQLAlchemy中这会是什么样子,但希望并解释为什么查询是这样的,这将有助于你实现目标。
这是一个外部联接 - 你想要一个表(User)中的所有记录,即使其他表(UserTag)中没有记录,如果我们把User放在第一个就是左连接。除此之外,您需要UserTag中没有匹配的所有记录用于特定过滤器。
SELECT user.user_id, email, phone
FROM user LEFT JOIN usertag
ON usertag.user_id = user.user_id
AND usertag.tag IN ('tag1', 'tag2')
WHERE usertag.user_id IS NULL;
答案 1 :(得分:0)
SQL会像这样
select u.* from user u join usertag ut on u.id = ut.user_id and ut.tag not in ('tag1', 'tag2');
我没有使用SQLAlchemy,因此您需要将其转换为等效的SQLAlchemy查询。
希望它有所帮助。
感谢。
答案 2 :(得分:0)
假设您的模型定义了如下关系:
class User(Base):
...
class UserTag(Base):
...
user = relationship("User", backref="tags")
查询如下:
qry = session.query(User).filter(~User.tags.any(UserTag.tag.in_(tags))).order_by(User.id)