2011-04-19 86 views
2

我有三個簡單的表:基於ManyToMany的組,權限和group_permissions。 我的問題是在執行一個查詢時,給定組ID(pk)將使用所有權限(包括與給定組關聯的那些結果集以及與該組關聯的結果集)來檢索結果集。ManyToMany查詢問題

我已經試過類似:

SELECT * 
FROM permission 
LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id 
LEFT JOIN group ON group_permissions.group_id = group.id 
WHERE group.id = 123 

,但它只是不工作...

任何建議嗎?

謝謝大家的回答,我只用了不到30分鐘就解決了我的問題!這不是什麼嗎?

SELECT * 
FROM auth_permission 
LEFT JOIN auth_group_permissions ON auth_group_permissions.permission_id = auth_permission.id AND auth_group_permissions.group_id = 123  
LEFT JOIN auth_group ON auth_group.id = auth_group_permissions.group_id 
+0

這是完整的查詢?你提到的給定組ID的測試在哪裏? – 2011-04-19 18:42:03

+0

我忘了:(剛剛編輯it.tk – Abel 2011-04-19 18:56:33

+0

這就是我所懷疑的,這就是爲什麼我問這個問題的原因。正如我在下面對Steve Mayne的評論中所提到的那樣,您無法在where子句中檢查該值,因爲它會取消左連接。我已經發布了一個解決這個問題的答案 – 2011-04-19 18:59:28

回答

2

group是SQL中的關鍵字。使用關鍵字命名錶或字段通常不是一個好主意,但如果必須,則必須將它們括在通常位於鍵盤左上角的反引號字符中,在轉義鍵下:

SELECT * 
FROM permission 
LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id 
LEFT JOIN `group` ON group_permissions.group_id = `group`.id 

什麼是組ID用於指定?如果您沒有使用它進行過濾,那麼需要指定什麼?

+0

但是你不想在WHERE子句中檢查group.id = 123,這將否定LEFT JOIN並強制它像INNER JOIN一樣行爲 – 2011-04-19 18:47:24

+0

這是真的 - 說實話,說它「檢索所有權限」有點令人困惑 - 所以指定了什麼? – 2011-04-19 18:49:11

+0

我想檢索所有權限(就像SELECT * FROM權限一樣),但是區分給定的權限組和其他人沒有使用 – Abel 2011-04-19 18:50:59

4

正如各種註釋中所提到的,您無法在WHERE子句中測試group.id的值,因爲它會取消LEFT JOIN並強制它像INNER JOIN一樣工作。

相反,要在連接條件的該測試部分:

SELECT * 
    FROM permission 
     LEFT JOIN group_permissions 
      ON group_permissions.permission_id = permission.id 
     LEFT JOIN `group` 
      ON group_permissions.group_id = `group`.id 
       AND `group`.id = 123 
+0

你已經提出了一個很好的觀點,現在左連接沒有被否定。儘管如此,我得到重複的項目(例如,與其他組相關的權限) 我已經設法解決這個問題: SELECT * FROM permission LEFT JOIN group_permissions ON group_permissions.permission_id = permission.id AND group_permissions .group_id = 123 LEFT JOIN group ON group_permissions.group_id = group.id 謝謝 – Abel 2011-04-19 19:26:46

+0

抱歉格式化,只能看到如何在這裏編碼:) – Abel 2011-04-19 19:28:36