我正在尝试编写一个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>
答案 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;