我正在嘗試創建一個權限系統,但我無法選擇資料庫上所有可能的選項。例如,考慮到我的資料庫中有以下表:
tb_group
id | group | slug
1 | Admin | admin
2 | Manager | manager
3 | Store Manager | store-manager
4 | Secretary | secretary
tb_area
id | area
1 | products
2 | users
3 | categories
4 | purchases
tb_permission
id_store | id_group | id_area | access | add | edit | remove
2 | 2 | 1 | 1 | 0 | 0 | 0
2 | 2 | 3 | 1 | 1 | 1 | 0
我想要的預期結果是從特定組中獲得所有可能區域的所有可能權限(訪問、添加、編輯、洗掉)。所以我會有這個最終結果:
id_store | id_group | area | access | add | edit | remove
2 | 2 | products | 1 | 0 | 0 | 0
2 | 2 | users | 0 | 0 | 0 | 0
2 | 2 | categories | 1 | 1 | 1 | 0
2 | 2 | purchases | 0 | 0 | 0 | 0
因此,即使我在表上沒有任何tb_permission用于 group2和 area的暫存器2,4我也希望將它們放在帶有nullor0值的查詢結果中。
這是我目前擁有的代碼,但它僅在該區域存在于tb_permission桌子上時才顯示結果。
SELECT
tp.access, tp.add, tp.edit, tp.remove,
ta.area,
tg.slug
FROM tb_permission tp
LEFT JOIN tb_area ta
ON ta.id = tp.id_area
LEFT JOIN tb_group tg
ON tg.id = tp.id_group
WHERE tp.id_store = 2
所以我想獲得組號 2 擁有的所有權限,以及該組仍然沒有在資料庫上注冊的所有權限。但是我的查詢只回傳資料庫中已經存在的那些。是否可以通過單個查詢獲得我期望的結果?
uj5u.com熱心網友回復:
你需要LEFT JOIN與tp_permission. 將條件放在條件中tp.id_store = 2,ON這樣它就不會過濾掉不匹配的行。
您可以CROSS JOIN通過組和區域表來獲取所有組合。
SELECT 2 AS id_store, tg.id AS id_group, ta.area,
IFNULL(tp.access, 0) AS access,
IFNULL(tp.add, 0) AS add,
IFNULL(tp.edit, 0) AS edit,
IFNULL(tp.remove, 0) AS remove
FROM tb_group AS tg
CROSS JOIN tb_area AS ta
LEFT JOIN tb_permission AS tp
ON ta.id = tp.id_area AND tg.id = tp.id_group AND tp.id_store = 2
WHERE tg.id = 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493845.html
下一篇:只回傳沒有組的行匹配的組鍵
