2016-10-03 9 views
1

3番目の選択結果は、最初の2つの選択結果の重複結果です。 それでは、私のデータセットはわずか5 idsだと言うことができます。 最初の2つのステートメントはids 1,2,3を生成する有効= 1 ids 4,5 enabled = 0が必要な最後のステートメントmysql:SELECTに重複した結果を表示しない

しかし今はID 1,2,3,4,5が有効になっている= 1 PLUSのid有効1,2,3,4,5 = 0

SELECT p.*, 1 as enabled 
    FROM member_permissions mp 
    JOIN permissions p ON p.permission_id = mp.permission_id 
    WHERE member_id = 1 
UNION 
    SELECT pgp.*, 1 as enabled 
    FROM member_permissions mp 
    JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id 
    JOIN permissions pgp ON pgp.permission_id = pl.permission_id 
    WHERE member_id = 1 
UNION 
    SELECT *, 0 as enabled 
    FROM permissions p 
+0

を働くことができるよう。それはあなたが不平を言っている出力を正確に生成するように縛られています。 – EJP

+0

GROUP BYはあなたが探しているものです... –

+0

最後の選択のポイントは、最初の2つの選択から表示されなかった残りのデータを生成することです。必要な残りのデータを作成するにはどうすればよいですか? – joejoeso

答えて

0

は、残念ながら、あなたは下のクエリからそれらを削除するには二回2つのトップのクエリを実行する必要があります。

SELECT p.*, 1 as enabled 
    FROM member_permissions mp 
    JOIN permissions p ON p.permission_id = mp.permission_id 
    WHERE member_id = 1 
UNION 
    SELECT pgp.*, 1 as enabled 
    FROM member_permissions mp 
    JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id 
    JOIN permissions pgp ON pgp.permission_id = pl.permission_id 
    WHERE member_id = 1 
UNION 
    SELECT *, 0 as enabled 
    FROM permissions p where p.permission_id not in (
     SELECT p.permission_id 
      FROM member_permissions mp 
      JOIN permissions p ON p.permission_id = mp.permission_id 
      WHERE member_id = 1 
     UNION ALL 
     SELECT pgp.permission_id 
      FROM member_permissions mp 
      JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id 
      JOIN permissions pgp ON pgp.permission_id = pl.permission_id 
      WHERE member_id = 1 
    ) 
0

あなたはその場合は、左結合を試してみてください。

SELECT DISTINCT 
     prm.*, 
     CASE 
     WHEN mp.member_id IS NULL OR mp2.member_id IS NULL THEN 0 
     ELSE 1 
     END AS ENABLED 
    FROM permissions prm 
    LEFT JOIN member_permissions mp 
     ON mp.permission_id = prm.permission_id 
     AND mp.member_id = 1 
    LEFT JOIN permission_link pl 
     ON pl.permission_group_id = prm.permission_group_id 
    LEFT JOIN member_permissions mp2 
     ON mp2.permission_group_id = pl.permission_group_id 
     AND mp2.member_id = 1 

ない最善の解決策だと思うが、それは私が最終UNION/SELECTのポイントを見ることができない

関連する問題