2017-09-23 16 views
0

我已經嘗試了數個小時才能看到它。我對mysql仍然很陌生,但在使用我發現的資源和示例之後,我設法實現了令人印象深刻的查詢。我有點卡在這裏。道歉,如果我沒有問得很好。被用於一個項目中管理類和類成員JOIN三個表不是很需要的生產成果

三個表。

table a = project membership 
id user_id project_id 
== ======= ========== 
1 1  10 
2 1  12 
3 3  45 
4 5  12 



table b = categories 
id name project_id 
== ==== ========== 
1 cat1 10 
2 cat4 12 
3 cat8 45 




tabke c = category members 
id user_id_added category_id capability 
== ============= =========== ========== 
1 1    2   1 
2 3    3   2 
3 5    3   1 
4 5    2   0 



Required result 


members of project 2 

user_id category capability_in_category 
======= ======== ====================== 
1  2  1 
5  2  0 


SELECT a.user_id 
     , c.capability 
     , b.id as category 

    FROM a 
     LEFT OUTER JOIN b 
      ON a.project_id = c.project_id 
     LEFT OUTER JOIN c 
      ON b.id = c.category_id 
     WHERE a.project_id = $project_id 
     AND c.category_id = $category_id; 

這種感覺就像我並不需要加入三個表,但我沒有看到與類別成員表加入該項目表的方式,而不使用類別表(B)。我正在運行的查詢幾乎可行,但用戶功能無法正確返回。我使用左外連接作爲成員可能並不總是屬於類別的一部分,但仍然需要在項目中顯示爲成員。我一直在嘗試各種連接和子查詢,但沒有成功。我基本上需要項目中的成員名單,並且如果他們是某個類別的一部分,則要顯示他們對特定類別的能力。我覺得可能有幾種方法可以做到這一點,但我正在努力彌合的灰色地帶。

+0

見https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

回答

0

的問題是模糊的,所以我可以幫助你解決錯誤的問題,但如果你想有列出的特定項目的所有成員(無論其能力),並列出指定類別的功能列出來,然後:

SELECT project_memberships.user_id 
    , category_members.category_id AS category 
    , category_members.capability AS capability 

FROM project_members 
    LEFT OUTER JOIN categories 
     ON project_members.project_id = categories.project_id 
    LEFT OUTER JOIN category_members 
     ON categories.id = category_members.category_id 
     AND category_members.user_id_added = project_membership.user_id 
    WHERE project_members.project_id = $project_id 
    AND (categories.id = $category_id OR categories.id IS NULL); 

應該讓你。

我改變了樹的事情相比,你的原始查詢:

  1. 我使用的表名,因爲它們比「A,B,C」說
  2. 我加入了額外的約束category_members.user_id_added = project_membership.user_id到第二加入以便不將不同用戶的category_members加入到project_members記錄中。
  3. 我鬆開的WHERE條件,使得不具有所需能力成員也被顯示。對於這些記錄,categorycapability將是NULL

至於你不得不加入三個表的答案是肯定的,你需要這樣做。

+0

謝謝你確認我需要完成所有這三個。最後這是一個有趣的選擇。我一直盯着這個很長的一段時間,隨着我走過去變得更加困惑,我會休息一下,看看我能否更好地解釋自己。由於 – fullmoonfriday

+0

我想我有我的結果,問題是,如:在項目中的兩個用戶,一個用戶是類別的一部分,但結果是給我的類別兩個項目的用戶的能力。它應該爲第二個用戶返回null,但我認爲該連接仍然有效,因爲沒有任何說明與第三個表的連接應該不會爲第二個用戶返回結果。我反而把第一個用戶的能力作爲第二個用戶的能力 – fullmoonfriday

+0

@leighgregg我在你的評論後更新了我的答案。 – ulferts