2016-11-05 44 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在最後一排

相關問題