我假設這個表的天生關鍵是document_id + subject_id,而且id是一個代理; IOW,document_id和subject_id是唯一的。因此,我只是假裝它不存在,而且一個獨特的約束是關鍵。
讓我們從顯而易見的開始。
SELECT document_id, subject_id
FROM document_subjects
WHERE subject_id IN (17,76)
,讓你你想要的一切加你不想東西。所以我們需要做的就是過濾出其他的東西。 「其他東西」是具有不等於期望主題的計數的計數的行的組。
SELECT document_id
FROM document_subjects
WHERE subject_id IN (17,76)
GROUP BY document_id
HAVING COUNT(*) = 2
請注意,因爲它不參與分組,所以刪除了subject_id。更進一步,我將添加一個名爲subjects_i_want的假想表,其中包含N行您想要的主題。
SELECT document_id
FROM document_subjects
WHERE subject_id IN (SELECT subject_id FROM subjects_i_want)
GROUP BY document_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want)
顯然subjects_i_want可以換成另一個子查詢,臨時表或其他。但是,一旦擁有了document_id的這個列表,就可以在更大查詢的子查詢中使用它。
SELECT document_id, subject_id, ...
FROM document_subjects
WHERE document_id IN(
SELECT document_id
FROM document_subjects
WHERE subject_id IN (SELECT subject_id FROM subjects_i_want)
GROUP BY document_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want))
或其他。
很高興知道您是如何爲查詢提供參數的。我看到一個答案,雖然非常好,但它只能在參數集中精確地使用2個值。如果你可以限制參數的數量,例如,最多10個,那麼這是一個對話。如果你需要該應用程序是靈活的,那麼建議將會不同。 – Eugene 2009-09-10 23:08:33
謝謝,輸入基本上是「選擇任意數量的主題」,因此主題ID的集合可以像主題數量一樣增長(理論上)。 – Maciek 2009-09-10 23:35:20