我正在使用名为MunkiReport的Mac OSX客户端报告工具。这个工具使用一个MySQL数据库和一个名为inventoryitem
的表,看起来像这样(我留下了一些列):
| id | serial_number | path
| 1 | C01 | Applications/Application01.app
| 2 | C01 | Applications/Application02.app
| 3 | C01 | Applications/Application03.app
| 4 | C02 | Applications/Application01.app
| 5 | C02 | Applications/Application03.app
| 6 | C02 | Applications/Application04.app
现在假设我要列出所有安装了Application01和Application03的serial_numbers,我这样做:
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的serial_numbers ......
我尝试了几件事,但我做不到。我想也许是一个子查询?首先列出Application03,并从该数据列表中列出所有没有Application02的serial_numbers。
我有点像MySQL的新手,所以它让我感到困惑。
答案 0 :(得分:1)
是的,您可以使用子查询获得所需的输出。我会使用NOT EXISTS子查询来获得所需的输出:
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()运算符或左连接执行此操作。但我会把这些例子留给别人或让自己弄明白。
答案 1 :(得分:1)
您可以尝试在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
答案 2 :(得分:0)
加入一个SELECT语句,该语句通过SELECT语句获取应用程序3的所有序列号,该语句列出未安装应用程序2的所有序列号(JOIN ON serial_number)