遇到PostgreSQL查询问题

时间:2013-11-26 08:20:39

标签: python postgresql sqlalchemy

我有以下两张表:

用户

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。

3 个答案:

答案 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)