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 的序列号(JOIN 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
我正在为 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 的序列号(JOIN 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