mysql连接从非索引中排除?

时间:2015-10-06 05:14:50

标签: mysql join

我正在尝试获取包含特定产品ID但不包含不同产品ID的订单的销售数据条目列表。我需要来自一个表的客户数据和来自另一个表的产品数据(特别是数量)。

'orders'包含客户数据的表格如下所示:

+---------+---------------------------+-----------------+
| OrderID |       CustomerName        | CustomerAddress |
+---------+---------------------------+-----------------+
|     123 | Joe Smith                 | 123 wherever st |
|     124 | Jane Doe                  | 555 Fake Rd     |
|     125 | Pete Thompson             | 1600 Main St    |
+---------+---------------------------+-----------------+

'order_products'表可能如下所示:

+---------+-----------+----------+
| OrderID | ProductID | Quantity |
+---------+-----------+----------+
|     123 |       400 |        1 |
|     123 |       401 |        1 |
|     124 |       400 |        2 |
|     125 |       401 |        1 |
+---------+-----------+----------+

在这个特定的例子中,我希望看到一个结果,只显示包含产品ID 400但不包含401的订单。使用这个假数据,它将是一个单行结果显示:

+---------+--------------+-----------------+----------+
| OrderID | CustomerName | CustomerAddress | Quantity |
+---------+--------------+-----------------+----------+
|     124 | Jane Doe     | 555 Fake Rd     |        2 |
+---------+--------------+-----------------+----------+

我试过这个:

SELECT o.OrderID, o.CustomerName, o.CustomerAddress, op.Quantity
FROM orders o
LEFT JOIN order_products op
ON o.orders_id = op.orders_id
WHERE op.ProductID = 400
AND op.ProductID != 401

但即使它包含ProductID 401,我仍然会返回订单号123.我理解为什么(因为order_products包含每个产品的一行)但我不知道还有什么可以尝试。

1 个答案:

答案 0 :(得分:2)

使用NOT EXISTS

SELECT o.OrderID, o.CustomerName, o.CustomerAddress, op.Quantity
FROM orders o
LEFT JOIN order_products op
ON o.orders_id = op.orders_id
WHERE op.ProductID = 400 AND 
      NOT EXISTS (SELECT 1
                  FROM order_products AS op2
                  WHERE op2.orders_id = o.orders_id AND op2.ProductID = 401)

这将排除与orders的{​​{1}}记录相关的order_products条记录。