2012-05-11 2 views
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 (?)) 

? затем заменяется в запросе по списку тегов, которые я не хочу включать.

Это прекрасно работает, когда клиент имеет только один тег, но как только они получат несколько тегов, они появятся, несмотря на исключение, так как один из их других тегов соответствует.

Следует иметь в виду, что это необходимо для продолжения работы при добавлении дополнительных предложений (таких как требование присутствия других тегов или соответствия другим атрибутам клиента), но любая точка в правильном направлении будет оценена.

ответ

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; 
Смежные вопросы