2

私は3つのテーブルを持っています:

section
id
name

permission
id
section_id
name

exclusion_permission
permission_id

クエリは次のとおりです。

SELECT
    p.id AS permission_id,
    p.name AS permission_name,
    s.id AS section_id,
    s.name AS section_name
FROM
    section s

LEFT OUTER JOIN
    permission p
ON
    p.section_id = s.id

LEFT OUTER JOIN
    exclusion_permission lep
ON
    lep.permission_id = p.id

WHERE
    lep.permission_id IS NULL

テーブルデータは次のとおりです。

section
id     name
1      admin
2      sales
3      moderator
4      intern

permission
id     section_id    name
1      1             root
2      2             sell
3      2             buy
4      3             edit_user
5      3             delete_user

クエリは

1, root, 1, admin
2, sell, 2, sales
3, buy, 2, sales
4, edit_user, 3, moderator
5, delete_user, 3, moderator
,, 4, intern

ここで、次の除外権限をミックスに投入すると、次のようになります。

exclusion_permission
permission_id
1
5

クエリは次を返します。

2, sell, 2, sales
3, buy, 2, sales
4, edit_user, 3, moderator
,, 4, intern

ご覧のとおり、モデレーターセクションには、もう1つの行が関連付けられているため、まだそこにあります。ただし、adminセクションは、関連付けられている唯一の権限が除外されているため、削除されています。私がしたいのは、クエリが次を返すようにすることです。

,, 1, admin
2, sell, 2, sales
3, buy, 2, sales
4, edit_user, 3, moderator
,, 4, intern

そのため、セクションに権限がない場合は、セクションを表示します。また、セクションにすべて除外されている権限がある場合でも、関連付けられた権限のないセクションを表示します。

どうすればいいですか?

4

2 に答える 2

0

結合の順序を変更し、見つからpermissionなかった場合にのみ結合します。exclusion_permission

SELECT
    p.id AS permission_id,
    p.name AS permission_name,
    s.id AS section_id,
    s.name AS section_name
FROM
    section s
LEFT OUTER JOIN
    exclusion_permission lep
ON
    lep.permission_id = s.id
LEFT OUTER JOIN
    permission p
ON
    p.section_id = s.id
    AND lep.permission_id IS NULL

SQLFiddleでの実例。

于 2013-02-06T15:44:13.233 に答える
0

UNIONこれらのレコードを:で追加します

...
UNION
SELECT NULL,
       NULL,
       id,
       name
FROM section
WHERE id NOT IN (SELECT section_id
                 FROM permission
                 WHERE id NOT IN (SELECT permission_id
                                  FROM exclusion_permission))

SQLフィドル

于 2013-02-06T15:55:34.217 に答える