【问题标题】:SQLAlchemy distinct() doesn't return unique records with a keyword searchSQLAlchemy distinct() 不返回关键字搜索的唯一记录
【发布时间】:2015-09-03 12:57:40
【问题描述】:

我有一个搜索栏,它使用以下查询搜索用户:

db.session.query(User).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

如您所见,它使用关键字(来自搜索查询形成的列表)进行搜索。如果我搜索“John Smith”,搜索将找到名称包含“John”的用户,然后找到名称包含“Smith”的同一用户,因此它将返回该用户两次。

为了解决这个问题,我尝试像这样使用distinct()

db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

但它不起作用所以我尝试使用distinct(User.id)

db.session.query(User).distinct(User.id).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

虽然这也不起作用。 那么问题是什么?

编辑:

有一点我忘了说代码是这样的:

query = 'John Smith'
for keyword in query.split():
    db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()

这就是为什么它返回同一用户的 2 个。我使用 for 循环是因为数据库中还有其他字段,所以如果我搜索 John Smith Mexico,它将按每个单词进行搜索。

【问题讨论】:

    标签: python database sqlalchemy flask-sqlalchemy


    【解决方案1】:

    解决您的问题的一种方法是对您想要搜索的所有关键字进行一个唯一的查询。 (也就是说,而不是 distinct,它不知道您实际上是在循环中运行查询;distinct 将独立应用于每个查询,这就是您得到 2 个结果的原因)。

    这样的事情会起作用:

    In [17]:
    
    from sqlalchemy import or_
    query = 'John Smith'
    keyword_c = [User.name.contains(keyword) for keyword in query] + [User.location.contains(keyword) for keyword in query]
    q = session.query(User).filter(or_(*keyword_c))
    for x in q.limit(16).all():
        print x.name
    
    John Smith
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2011-01-07
      相关资源
      最近更新 更多