Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 同一列中的不同条件_Mysql_Database_Subquery - Fatal编程技术网

Mysql 同一列中的不同条件

Mysql 同一列中的不同条件,mysql,database,subquery,Mysql,Database,Subquery,我正在为MacOSX客户端使用一个名为MunkiReport的报告工具。该工具使用一个MySQL数据库,其表名为inventoryitem,如下所示(我遗漏了一些列): 现在,假设我想列出同时安装了Application01和Application03的所有序列号,我是这样做的: SELECT `serial_number` FROM `inventoryitem` WHERE `path` IN ('Applications/Application01.app','Applications/A

我正在为MacOSX客户端使用一个名为MunkiReport的报告工具。该工具使用一个MySQL数据库,其表名为
inventoryitem
,如下所示(我遗漏了一些列):

现在,假设我想列出同时安装了Application01和Application03的所有序列号,我是这样做的:

SELECT `serial_number`
FROM `inventoryitem`
WHERE `path` IN ('Applications/Application01.app','Applications/Application03.app')
GROUP BY `serial_number`
HAVING COUNT(`path`)=2
产出将是:

| serial_number |
|     C01       |
|     C02       |
但是,我真正想要的是列出所有安装了Application03但没有安装Application02的序列号

我试过几种方法,但都做不好。我想也许是子查询?首先列出应用程序03,然后从该数据中列出不带应用程序02的所有序列号


我是MySQL的新手,所以它让我有点困惑。

加入一个SELECT语句,该语句获取安装了应用程序3的所有序列号,并加入一个SELECT语句,该语句列出了未安装应用程序2的所有序列号(加入序列号)

连接一个SELECT语句,该语句获取安装了应用程序3的所有序列号,并使用一个SELECT语句列出未安装应用程序2的所有序列号(连接序列号)

是的,您可以使用子查询获得所需的输出。我将使用子查询获得所需的输出:

SELECT DISTINCT `serial_number`
FROM `inventoryitem` i1
WHERE `path`='Applications/Application03.app'
    AND NOT EXISTS (SELECT 1 FROM `inventoryitem` i2 WHERE i2.`path`='Applications/Application02.app' and i2.serial_number=i1.serial_number)

但您可以使用IN()运算符或左连接来完成此操作。但是我将把这些示例留给其他人或您自己去解决。

是的,您可以使用子查询获得所需的输出。我将使用子查询获得所需的输出:

SELECT DISTINCT `serial_number`
FROM `inventoryitem` i1
WHERE `path`='Applications/Application03.app'
    AND NOT EXISTS (SELECT 1 FROM `inventoryitem` i2 WHERE i2.`path`='Applications/Application02.app' and i2.serial_number=i1.serial_number)

但您可以使用IN()运算符或左连接来完成此操作。但我将把这些示例留给其他人或您自己去弄清楚。

您可以尝试在HAVING子句中聚合条件表达式,如下所示:

SELECT `serial_number`
FROM `inventoryitem`
WHERE `path` IN ('Applications/Application02.app','Applications/Application03.app')
GROUP BY `serial_number`
HAVING COUNT(case `path` when 'Applications/Application03.app' then 1 end)=1
   AND COUNT(case `path` when 'Applications/Application02.app' then 1 end)=0

您可以尝试在HAVING子句中聚合条件表达式,如下所示:

SELECT `serial_number`
FROM `inventoryitem`
WHERE `path` IN ('Applications/Application02.app','Applications/Application03.app')
GROUP BY `serial_number`
HAVING COUNT(case `path` when 'Applications/Application03.app' then 1 end)=1
   AND COUNT(case `path` when 'Applications/Application02.app' then 1 end)=0

谢谢,这个有用!还有一个问题。此查询输出序列号。我想知道电脑的名字。此信息位于另一个名为
机器
的表中。我知道如何执行简单的连接:
从inventoryitem上的机器内部连接inventoryitem中选择计算机名称。serial\u number=machine.serial\u number
只需从查询的答案中添加where条件(注意表别名)。谢谢,这很有效!还有一个问题。此查询输出序列号。我想知道电脑的名字。此信息位于另一个名为
机器
的表中。我知道如何执行简单的连接:
从inventoryitem上的机器内部连接inventoryitem中选择计算机名称。serial\u number=machine.serial\u number
只需从查询的答案中添加where条件(注意表别名)。谢谢,我已经尝试过了。MySQL返回一个空的结果集(即零行)。它应该输出四个序列号。Shadow的解决方案似乎有效。@问题:那是因为我应该使用
COUNT
而不是
SUM
,或者在
CASE
表达式中包含
else 0
子句。我已经修改过了,现在应该可以用了。是的,这也很有效。向其中添加更多应用程序非常简单!谢谢,我试过了。MySQL返回一个空的结果集(即零行)。它应该输出四个序列号。Shadow的解决方案似乎有效。@问题:那是因为我应该使用
COUNT
而不是
SUM
,或者在
CASE
表达式中包含
else 0
子句。我已经修改过了,现在应该可以用了。是的,这也很有效。向其中添加更多应用程序非常简单!