これを行う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