MySQL与同一列的不同条件

时间:2016-01-25 16:42:44

标签: mysql database subquery

我正在使用名为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的新手,所以它让我感到困惑。

3 个答案:

答案 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的所有序列号(J​​OIN ON serial_number)