我有 2 张桌子:
1)一个订单表(OrderNumber
作为ID)
2) 一个 Items 表,它可以有多行,并且还有一OrderNumber
列将每一行与上面的 order 行联系起来。
大多数订单在 Items 表中有多行 - 但有些没有,我需要提取没有关联 Items 行的订单报告。
我可以在我的 PHP 中对 2 个查询执行此操作,但在 MySQL 中显然有更聪明的方法来执行此操作。我了解 JOINS 但通常是在两个表中都有数据的时候。如果两者都没有平局,我该如何解决?
我会使用 LEFT OUTER JOIN 或 FULL OUTER JOIN,具体取决于您的需要。如果您发布 2 个查询或一些示例数据会有所帮助...
OUTER 处理任何不存在的数据
这是一个可以帮助您的链接:http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
假设您的Items
表主键是Items_Id
SELECT * FROM Orders LEFT JOIN Items USING ( `OrderNumber` ) where Items.Items_Id IS NULL
除了上面列出的方式之外,我会说我会使用这种结构:
SELECT * FROM Order where not exists (SELECT NULL FROM Items where OrderNumber = Orders.OrderNumber);
您还可以在 Items 中的 OrderNumber 列上添加索引以获得更好的性能:
CREATE INDEX Idx_Items on Items (OrderNumber);
您可以将NOT IN
短语用于 where 子句。这将获得 ID 不在 Items 表中的订单记录。
SELECT * FROM Order WHERE Id NOT IN (SELECT OrderNumber FROM Items)