从搜索中排除与记录关联的记录

时间:2012-05-11 13:45:41

标签: sql ruby-on-rails activerecord

我正在尝试编写一个SQL搜索,它将允许返回任何标记有特定值的记录,并排除任何具有其他标记的结果。

使用连接模型应用标签,如下所示:

class Customer < ActiveRecord::Base
  has_many :tag_assignments
  has_many :tags, :through => :tag_assignments
end

class Tag < ActiveRecord::Base
  has_many :tag_assignments
  has_many :customers, :through => :tag_assignments
end

class TagAssignment < ActiveRecord::Base
  belongs_to :customer
  belongs_to :tag
end

我目前的查询是:

SELECT DISTINCT customers.* FROM customers LEFT OUTER JOIN tag_assignments ON tag_assignments.customer_id = customers.id WHERE (tag_assignments.tag_id NOT IN (?))

?然后在查询中用我不想包含的标签列表替换。

当客户只应用了一个代码时,此功能正常,但只要他们获得多个代码,即使排除这些代码,它们也会显示,因为其他代码之一匹配。

需要记住的是,当添加其他条款时(例如要求存在其他标记或与其他客户属性匹配),这需要继续工作,但是正确方向上的任何一点都将受到赞赏。< / p>

1 个答案:

答案 0 :(得分:2)

我生气了......但是你需要首先用标签来获取所有东西然后否定..

SELECT DISTINCT customers.*
FROM customers
OUTER JOIN (
SELECT DISTINCT customers.id
FROM customers
INNER JOIN tag_assignments ON tag_assignments.customer_id = customers.id
WHERE tag_assignments.tag_id IN (?)
) AS neg_customers ON (neg_customers.id = customers.id)
WHERE neg_customers.id IS NULL;