0

我正在尝试编写一个 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 (?))

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

当客户只应用了一个标签时,这很好用,但是一旦他们获得多个标签,尽管被排除在外,他​​们也会显示出来,因为他们的其他标签之一确实匹配。

需要记住的是,当添加附加子句(例如要求存在其他标签或匹配其他客户属性)时,这需要继续工作,但任何正确方向的点都会受到赞赏。

4

1 回答 1

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;
于 2012-05-11T14:02:56.153 回答