MySQL 来自同一列的不同条件

MySQL different conditions from same column

我正在为 Mac OSX 客户使用名为 MunkiReport 的报告工具。该工具使用一个 MySQL 数据库和一个名为 inventoryitem 的 table,看起来像这样(我省略了一些列):

|     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       |

但是,我真正想要的是列出所有 serial_numbers 确实安装了 Application03 但没有安装 Application02...

我已经尝试了几件事,但我做不好。我想也许是一个子查询?首先列出 Application03,然后从该数据列表中列出所有 serial_numbers,没有 Application02。

我对 MySQL 有点菜鸟,所以有点困惑。

JOIN SELECT 语句获取安装了应用程序 3 的所有序列号和 SELECT 语句列出所有未安装应用程序 2 的序列号(J​​OIN ON serial_number)

是的,您可以使用子查询获得所需的输出。我会使用 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() 运算符或左连接来实现。但我会把这些例子留给其他人或自己去弄清楚。

您可以尝试在 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