【问题标题】:How to filter the correct orders with MySQL (One order contains many lines)如何使用 MySQL 过滤正确的订单(一个订单包含多行)
【发布时间】:2010-06-28 09:23:43
【问题描述】:

我必须过滤没有特定产品的订单。

这很简单,但问题是每个订单可能有很多行,包含不同的产品。

这是我的数据示例:

ID | Product | Customer      | Quantidy | Date
 1 | Apple   | Alex Sorensen | 3        | 17.4.2009
 2 | Orange  | Alex Sorensen | 1        | 17.4.2009
 3 | Lime    | Alex Sorensen | 4        | 17.4.2009
 4 | Apple   | Fred Jonsson  | 1        | 30.5.2010
 5 | Lime    | Fred Jonsson  | 7        | 30.5.2010
ect...

具有相同date 和相同customer 的行表示相同的顺序。

如何找到所有订单中没有(例如)Orange 的订单?


我自己的(不工作的)MySQL 代码:

SELECT o.ID, k.Customer, o.Quantidy, p.Product, o.Date
FROM Products p, Orders o, Customers c
WHERE p.ID = o.ID
AND k.Customer = o.Customer
AND p.Product NOT IN ('Orange')
GROUP BY o.Date
ORDER BY o.ID DESC

问题是,即使我不想要“Alex Sorensen”的订单,因为它包含橙子,我得到他的其他行,但没有包含“Orange”的行。

我需要一个 SQL 代码来为我提供“Fred Jonsson”和其他订单中没有橙子的订单。

【问题讨论】:

  • 我无法理解您的模型。你加入productsp.id = o.id。这是否意味着您有一个 Appleid=1 和另一个 id=4
  • “p.ID = o.ID”是个错误,应该是“p.Product = o.Product”。我翻译并简化了其他语言的代码,这太糟糕了。
  • 您的p.Product = o.Product 是否与您选择的p.Product 相同(实际上是'Orange' 还是Orange 的ID)?
  • 是的,它们(p.Product = o.Product)是一样的。它是“橙色”的“id”

标签: php sql mysql select


【解决方案1】:

你应该可以使用NOT EXISTS:

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date
FROM Products p, Orders o, Customers c
WHERE p.product = o.product
AND c.Customer = o.Customer
AND NOT EXISTS ( SELECT 1 FROM Orders o2
                 WHERE o2.product = 'Orange'
                 AND o2.customer = o.customer
                 AND o2.date = o.date
               )

顺便说一下,尽量使用显式的连接语法,一旦你习惯了,它会让你的查询更容易阅读:

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date
FROM Orders o
JOIN Products p ON ( p.product = o.product )
JOIN Customers c ON ( c.Customer = o.Customer )
WHERE NOT EXISTS ( SELECT 1 FROM Orders o2
                   WHERE o2.product = 'Orange'
                   AND o2.customer = o.customer
                   AND o2.date = o.date
                 )

另一种方法是使用Left Join 并检查NULL

SELECT o.ID, c.Customer, o.Quantity, p.Product, o.Date
FROM Orders o
JOIN Products p ON ( p.product = o.product )
JOIN Customers c ON ( c.Customer = o.Customer )
LEFT JOIN Orders o2 ON (     o2.product = 'Orange'
                         AND o2.customer = o.customer
                         AND o2.date = o.date
                       )
WHERE o2.Id IS NULL

你将不得不尝试哪一个表现更好。

【讨论】:

  • 我用的是第一个!首先我只得到一个结果,但是当我在最后添加:“GROUP BY o.Date ORDER BY o.ID DESC”时,我一切正常。谢谢!!!!!!
  • 谢谢你给我这么多例子,对以后有帮助!
【解决方案2】:

改变

 p.Product NOT IN ('Orange')

k.Customer NOT IN (select DISTINCT Customer from Products where Product= 'Orange')


SELECT o.ID, k.Customer, o.Quantidy, p.Product, o.Date
FROM Products p, Orders o, Customers c
WHERE p.ID = o.ID
AND k.Customer = o.Customer
AND k.Customer NOT IN (select DISTINCT Customer from Products where Product= 'Orange')
GROUP BY o.Date
ORDER BY o.ID DESC

【讨论】:

  • Products 似乎没有Customer-列(我不希望它有一个)。你也不考虑Date,它也对订单进行分组。
  • 是的,“产品”没有客户。 “你也不考虑日期,它也对订单进行分组。” -> 对不起,我不明白,但我试图按日期分组,但它不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2022-01-23
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多