Mysql select,如何查找在同一列中具有给定值的应用程序名称

Mysql select,如何查找在同一列中具有给定值的应用程序名称,mysql,Mysql,我有一个表,其中包含应用程序名称和对该应用程序授予的权限。我需要找出哪些应用程序需要这两个方面 name permissions app1 perm1 app1 perm5 app1 perm6 app2 perm1 app2 perm8 app3 perm1 app3 perm6 app3 perm2 app3 perm4 如何找到同时具有“perm1和perm6”的应用程序名 或 或 这里有一个方法 SELECT t.n

我有一个表,其中包含应用程序名称和对该应用程序授予的权限。我需要找出哪些应用程序需要这两个方面

name   permissions
app1    perm1
app1    perm5
app1    perm6
app2    perm1
app2    perm8
app3    perm1
app3    perm6
app3    perm2
app3    perm4
如何找到同时具有“perm1和perm6”的应用程序名


这里有一个方法

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和AGGRATE函数,如果我们找到具有“perm1”的行,则t.permissons='perm1'返回1,否则返回0。(我们通过在IFNULL函数中包装t.permissions来处理NULL的情况。)

如果同时找到“perm1”和“perm6”,则HAVING谓词将evalulate为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

第四种方法是:

 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

这里有一个方法

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和AGGRATE函数,如果我们找到具有“perm1”的行,则t.permissons='perm1'返回1,否则返回0。(我们通过在IFNULL函数中包装t.permissions来处理NULL的情况。)

如果同时找到“perm1”和“perm6”,则HAVING谓词将evalulate为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

第四种方法是:

 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

即使这样似乎也能奏效。。。如果perm1或perm6中的任何一个是百分之……请从
Survey\u应用程序中选择
Name
,其中
manifest\u permission
IN('android.permission.DUMP','android.permission.INTERNET')组中的
Name
具有COUNT(*)=2这就是我实际运行它的方式如果我们保证没有两行,例如name='app1'和permissions='perm1',这将起作用。如果有,并且没有任何带有“perm6”的行,则返回“app1”。如果“perm6”也有一行,则不会返回“app1”,因为计数为3。@spencer7593此答案之前未更新。如果在
HAVING
子句中,您将在许可证A中提供
DISTINCT
,例如
HAVING COUNT(DISTINCT permissions)=2,则此操作仍然有效,即使此操作似乎有效。。。如果perm1或perm6中的任何一个是百分之……请从
Survey\u应用程序中选择
Name
,其中
manifest\u permission
IN('android.permission.DUMP','android.permission.INTERNET')组中的
Name
具有COUNT(*)=2这就是我实际运行它的方式如果我们保证没有两行,例如name='app1'和permissions='perm1',这将起作用。如果有,并且没有任何带有“perm6”的行,则返回“app1”。如果“perm6”也有一行,则不会返回“app1”,因为计数为3。@spencer7593此答案之前未更新。如果在
HAVING
子句中,您将在许可证A中提供
DISTINCT
,例如
HAVING COUNT(DISTINCT permissions)=2,则此选项仍然有效