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,则此选项仍然有效