2016-10-01 28 views
0

可以說我有一個名爲Document的數據庫表,其中包含我擁有的所有文檔的行。我有另一個名爲Shared的db表,它擁有指定的user_id有權訪問的文檔記錄(由其他人擁有)。因此,如果我是ex用戶1,我將使用我的user_id和user2的document_ids存儲在Shared表中的我的文檔位於Documents表和我有權訪問的user2文檔中。結合選擇取決於哪個表結果來自

Document 
id 
user_id 
type 
name 
permissions 

Shared 
id 
document_id 
used_id 
permissions 

Documents表中的每個條目都具有permissions =「all」。共享表中的每個條目都具有諸如{寫入,讀取,刪除}等許可級別的權限。在我的查詢中找回用戶foo擁有/可訪問的所有文檔,我想根據記錄是來自Documents還是共享來取回適當的權限。現在我有一個基本查詢,可以取回所有我擁有和可以訪問的文檔。我的嘗試是這樣的:

Select d.id, d.user_id, d.permissions 
from Document d 
    left join Shared s on s.document_id = d.id 
where s.user_id = 1 

的另一種嘗試:

Select d.id, d.user_id, 
     COALESCE(s.permissions, d.permissions) as permissions 
from Documents d 
    left join Shared s on s.document_id = d.id and s.user_id = 1; 
+0

是產品ID在共享表中有一個代理鍵? – Mackers

+0

共享表中的id與文檔或用戶表無關。這只是一個簡單的自動增量主鍵 –

+0

[編輯]你的問題,並添加一些樣本數據和基於該數據的預期輸出。 [_Formatted_](http://stackoverflow.com/editing-help#code)**文本**,請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-code-on-so-when-asked-question-285557#285557) –

回答

1

如果我理解正確的話,我相信,你只需要工會從每個表中的結果:

select * from 
    (select d.id as document_id, d.user_id, 'all' as permissions, d.name 
    from t_documents d 
    union all 
    select s.document_id, s.user_id, s.permissions, dtl.name 
    from t_shared s 
    left join t_documents dtl 
    on s.document_id = dtl.id) tot 
where tot.user_id = 1; 
+0

會比以下更高性能嗎?: 選擇d.id,d.user_id,COALESCE( s.permissions,d.permissions)作爲來自Documents的權限d在s.document_id = d.id和s.user_id = 1上離開連接共享s; –

+0

根據您的描述,您的表格是互斥的,其中文檔表格具有文檔所有者的權限,並且共享表格對每個文檔的所有者以外的任何人擁有權限。您不會在此處使用連接,因爲您理想情況下永遠不會在兩個表中都有相同用戶/文檔組合的記錄。工會是這種相互排斥的結果。 – Mackers

+0

我明白了。性能方面,聯盟是否會對連接產生更高效的查詢?另外,我相信你的答案不起作用,因爲現在它不查詢user_id –