0

アプリケーション名とアプリケーションに与えられた権限を含むテーブルがあります。これらの両方を必要とするアプリケーションを見つける必要があります

name   permissions
app1    perm1
app1    perm5
app1    perm6
app2    perm1
app2    perm8
app3    perm1
app3    perm6
app3    perm2
app3    perm4

「perm1 と perm6」の両方を含むアプリケーション名を見つけるにはどうすればよいですか?

4

2 に答える 2

2
SELECT name
FROM tableName
WHERE   permissions IN ('perm1','perm6')
GROUP BY name
HAVING COUNT(*) = 2

また

SELECT name
FROM tableName
WHERE   permissions IN ('perm1','perm6')
GROUP BY name
HAVING COUNT(DISTINCT permissions) = 2
于 2012-12-18T05:45:27.120 に答える
1

これを行う1つの方法を次に示します。

SELECT t.name
  FROM mytable t
 GROUP BY t.name
HAVING MAX(IFNULL(t.permissions,'')='perm1')
     + MAX(IFNULL(t.permissions,'')='perm6') = 2
 ORDER BY t.name

GROUP BY と集計関数を使用しています。「perm1」を含む行が見つかった場合、t.permissons='perm1' は 1 を返し、それ以外の場合は 0 を返します。 (NULL の場合は、 t.permissions を IFNULL 関数でラップします。)

「perm1」と「perm6」の両方が見つかった場合、HAVING 述語は TRUE と評価され、行が返されます。


EXISTS 述語を使用して相関サブクエリを実行する別の方法:

SELECT t.name
  FROM mytable t
 WHERE t.permissions = 'perm1'
   AND EXISTS 
       ( SELECT 1 
           FROM mytable s
          WHERE s.name = t.name
            AND s.permissions = 'perm6'
       )
 GROUP BY t.name
 ORDER BY t.name

または同等の、IN 述語を使用する:

 SELECT t.name
   FROM mytable t
  WHERE t.permissions = 'perm1'
    AND t.name IN 
        ( SELECT s.name
            FROM mytable s
           WHERE s.permissions = 'perm6'
             AND s.name IS NOT NULL
           GROUP BY s.name
        )
  GROUP BY t.name
  ORDER BY t.name

それを取得する4番目の方法は次のとおりです。

 SELECT t.name
   FROM mytable t
   JOIN mytable s
     ON t.name = s.name
    AND t.permissions = 'perm1'
    AND s.permissions = 'perm6'
  GROUP BY t.name
  ORDER BY t.name
于 2012-12-18T06:24:56.667 に答える