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

?クエリで、私が含まれたくないタグのリストで置き換えられます。

これは、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; 
関連する問題