Mysql 同一列中的不同条件
我正在为MacOSX客户端使用一个名为MunkiReport的报告工具。该工具使用一个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
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
子句。我已经修改过了,现在应该可以用了。是的,这也很有效。向其中添加更多应用程序非常简单!