這既是其他的答案几乎合成。
第一:堅持has_many through
@TheChamp建議。你可能已經在使用它,只是忘了寫它,否則它不會工作。那麼,你已經受到警告。
我一般盡我所能避免我的查詢中的原始SQL。我上面提供的select
提示產生了一個工作解決方案,但是會做一些不需要的東西,比如join
,如果沒有實際需要的話。所以,讓我們避免戳一個關聯。這次不行。
這裏談到爲什麼我在許多-to-many關聯寧願has_many through
到has_and_belongs_to_many
的原因:我們可以查詢加盟模式本身沒有原始SQL:
WorkerMembership.select(:worker_id).where(event: @event)
這不是結果還沒有,但它可以讓我們我們不想要的worker_id
的列表。然後,我們只是包裝此查詢到「給我所有,但這些傢伙」:
Worker.where.not(id: <...>)
所以最終的查詢是:
Worker.where.not(id: WorkerMembership.select(:worker_id).where(event: @event))
,並將其輸出單個查詢(上@event
與id
等於1
):
SELECT `workers`.* FROM `workers` WHERE (`workers`.`id` NOT IN (SELECT `worker_memberships`.`worker_id` FROM `worker_memberships` WHERE `worker_memberships`.`event_id` = 1))
我也給信貸@apneadiving他的解決方案和有關mysql2
的提示。 SQLite的explain
是可怕的!我的解決方案,如果我正確閱讀explain
的結果,就像@ apneadiving一樣。
@TheChamp還爲所有答案的查詢提供了性能成本。查看比較評論。
有趣! :) – apneadiving 2014-10-31 12:39:31
你會介意分擔兩者的費用嗎?只是好奇心 – apneadiving 2014-10-31 12:40:48
@apneadiving肯定的事情:http://pastebin.com/BupHkLQf(一定要打開文字包裝,'解釋'表很長) – 2014-10-31 12:52:27