2016-03-02 107 views
0

給定一個或多個owner_ids(例如2,4和6),我想返回鏈接到ownersresources.id的列表owners_has_resources。沒問題,我可以做SELECT DISTINCT ohr.resources_id FROM owners_has_resources ohr WHERE ohr.owners_id IN (2,4,6);從SQL查詢中排除記錄

現在我堅持的部分。我想回的resources.id列表與上面相同,但排除任何也與未缺失的業主(由owners.deleted!=true確定),其中的鏈接不會被刪除(由owners_has_resources.deleted!=true確定)

它可以假設owners.deletedtrue所有最初提供owners_ids(即2,4,6)

例如,給定owners_ids 2和4,我應該返回resources_id 2和3。注意,我的意思是說deleted=TRUE表明它被刪除了,但是因爲已經發布了使用前面的答案,所以我不會編輯這個問題。相反,下面的真值表顯示了owner_not_deletedresource_not_deleted

+-----------+-------------------+--------------+----------------------+ 
| owners_id | owner_not_deleted | resources_id | resource_not_deleted | 
+-----------+-------------------+--------------+----------------------+ 
|   2 | FALSE    |   1 | TRUE     | 
|   2 | FALSE    |   2 | TRUE     | 
|   4 | FALSE    |   2 | TRUE     | 
|   4 | FALSE    |   3 | TRUE     | 
|   5 | TRUE    |   1 | FALSE    | 
|   5 | TRUE    |   2 | TRUE     | 
|   7 | TRUE    |   2 | FALSE    | 
+-----------+-------------------+--------------+----------------------+ 

owners 
- id (INT PK) 
- name, etc 
- deleted (true/false) 

resources 
- id (INT PK) 
- name, etc 

owners_has_resources 
- owners_id (INT PK REFERENCES owners.id) 
- resources_id (INT PK REFERENCES resources.id) 
- deleted (true/false) 
+0

你的用戶表是什麼?這張桌子是和其他人聯繫在一起的嗎? – Wistar

+0

對不起,錯字。這應該是'所有者'。我會更新。 – user1032531

+1

這似乎很明顯,你需要什麼。但我會給予懷疑的好處。你可以顯示一個小數據樣本。這樣我可以確定你在問什麼? –

回答

0

什麼

SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id 
WHERE ohr.owners_id IN (2,4,6) 
AND (o.deleted = FALSE OR ohr.deleted = FALSE); 
+0

我認爲它需要'o.deleted = FALSE 或ohr.deleted = FALSE',但這似乎會導致其他問題。 – user1032531

+0

@ user1032531我做了更改。該查詢面臨什麼問題? – Wistar

+0

鑑於您的第一個查詢和我的編輯帖子中的虛構數據,它將僅返回resources_id#3,並且您編輯的查詢將返回#1,#2和#3。它應該只返回#2和#3。 – user1032531

0

首先,你選擇你想要,那麼你只能選擇那些不被非刪除的業主引用在NOT EXISTS

SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id 
WHERE ohr.owners_id IN (2,4,6) 
AND NOT EXISTS (
    SELECT NULL FROM owners_has_resources ohr2 
    JOIN owners o2 ON ohr2.owners_id = o2.id 
    WHERE ohr2.deleted=FALSE 
    AND o2.deleted=FALSE 
    AND ohr.resources_id=ohr2.resources_id 
) 
+0

謝謝StephaneM。需要稍微調整一下。 – user1032531

0
SELECT DISTINCT ohr1.resources_id 
FROM owners_has_resources ohr1 
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id AND ohr2.deleted = TRUE 
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id AND ohr2.deleted = TRUE 
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL; 

數據或

SELECT DISTINCT ohr1.resources_id 
FROM owners_has_resources ohr1 
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id 
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id 
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL AND ohr2.deleted = TRUE AND ohr2.deleted = TRUE; 

我希望對一種方法是否比其他方法更好的評論。