2016-11-05 122 views
3

我有两个表格命令产品和productsinstocks。这里是表结构:MySQL - 使用LEFT JOIN给出意想不到的结果

orderedproducts表:

+-----+---------+-----------+----------+--------------+ 
| id | orderid | productid | quantity | productgroup | 
+-----+---------+-----------+----------+--------------+ 
| 117 | 1016186 | 265385 |  5 | Main   | 
| 118 | 1016186 | 407454 |  6 | Main   | 
| 119 | 1016186 | 975045 |  7 | Main   | 
| 120 | 1016186 | 975046 |  8 | Main   | 
+-----+---------+-----------+----------+--------------+ 

productsinstocks表:

+----+---------+-----------+----------+ 
| id | stockid | productid | quantity | 
+----+---------+-----------+----------+ 
| 20 | 903958 | 265385 |  200 | 
| 21 | 903958 | 407454 |  205 | 
| 22 | 903958 | 975045 |  210 | 
+----+---------+-----------+----------+ 

正如你看到的,股票只有三个型号的产品在orderedproducts表。我想加入这些表来实现以下目的:

+---------+-----------+---------+-----------+------------+ 
| orderid | productid | stockid | order_qty | stock_qty | 
+---------+-----------+---------+-----------+------------+ 
| 1016186 | 265385 | 903958 |   5 |  200 | 
| 1016186 | 407454 | 903958 |   6 |  205 | 
| 1016186 | 975045 | 903958 |   7 |  210 | 
| 1016186 | 975046 | 903958 |   8 |  NULL | 
+---------+-----------+---------+-----------+------------+ 

我用下面的查询:

SELECT op.orderid, op.productid, plo.stockid, op.quantity order_qty, plo.quantity stock_qty FROM orderedproducts op 
LEFT JOIN productsinstocks plo 
ON op.productid=plo.productid 
WHERE op.orderid=1016186 
AND plo.stockid=903958 

,但它给了我下面的结果:

+---------+-----------+---------+-----------+------------+ 
| orderid | productid | stockid | order_qty | stock_qty | 
+---------+-----------+---------+-----------+------------+ 
| 1016186 | 265385 | 903958 |   5 |  200 | 
| 1016186 | 407454 | 903958 |   6 |  205 | 
| 1016186 | 975045 | 903958 |   7 |  210 | 
+---------+-----------+---------+-----------+------------+ 

我不我知道我错过了什么。

回答

2

试试这个

SELECT op.orderid, op.productid, plo.stockid, op.quantity order_qty, plo.quantity stock_qty FROM orderedproducts op 
LEFT JOIN productsinstocks plo 
    ON op.productid=plo.productid AND plo.stockid=903958 
WHERE op.orderid=1016186 
5

WHERE子句以下条件负责结果集中的丢失记录:

WHERE plo.stockid = 903958 

orderedproducts表中缺少的记录不匹配任何记录的productsinstocks表。因此,此记录的stockid值将为NULL,并且您当前的WHERE条件会将其过滤掉。

相反,添加一个检查OR plo.stockid IS NULLWHERE条款保留此记录:

SELECT op.orderid, op.productid, plo.stockid, op.quantity order_qty, 
     plo.quantity AS stock_qty 
FROM orderedproducts op 
LEFT JOIN productsinstocks plo 
    ON op.productid = plo.productid 
WHERE op.orderid = 1016186 AND 
     (plo.stockid = 903958 OR plo.stockid IS NULL) 

演示在这里:

SQLFiddle

+0

这仍然会生成相同的结果集。 – MehdiB

+0

您确定您复制了我的确切查询吗?它应该工作AFAIK。 –

+0

是的,我复制并粘贴了你发送的内容。 – MehdiB

0

首先,让我们看看有什么WHEREON条款做

条款决定的输出被选中的行。

ON子句决定要为连接选择哪些行。

WHERE plo.stockid=903958 

这部分WHERE子句消除了输出的最后一行。

这里我们要在连接操作之前选择行。所以,让我们将条件从WHERE改为ON条款。

SELECT op.orderid, op.productid, plo.stockid, op.quantity order_qty, plo.quantity stock_qty FROM orderedproducts op 
LEFT JOIN productsinstocks plo 
ON op.productid=plo.productid AND plo.stockid=903958 AND op.orderid=1016186 

此外,你应该想到stockidNULL,而不是903958在最后一排

相关问题