Meh*_*diB 3 mysql select left-join
我有两个表订购产品和产品原料.这是表结构:
有序产品表:
+-----+---------+-----------+----------+--------------+
| 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 |
+-----+---------+-----------+----------+--------------+
Run Code Online (Sandbox Code Playgroud)
productsinstocks表:
+----+---------+-----------+----------+
| id | stockid | productid | quantity |
+----+---------+-----------+----------+
| 20 | 903958 | 265385 | 200 |
| 21 | 903958 | 407454 | 205 |
| 22 | 903958 | 975045 | 210 |
+----+---------+-----------+----------+
Run Code Online (Sandbox Code Playgroud)
如您所见,该库存在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 |
+---------+-----------+---------+-----------+------------+
Run Code Online (Sandbox Code Playgroud)
我使用了以下查询:
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
Run Code Online (Sandbox Code Playgroud)
但它给了我以下结果:
+---------+-----------+---------+-----------+------------+
| orderid | productid | stockid | order_qty | stock_qty |
+---------+-----------+---------+-----------+------------+
| 1016186 | 265385 | 903958 | 5 | 200 |
| 1016186 | 407454 | 903958 | 6 | 205 |
| 1016186 | 975045 | 903958 | 7 | 210 |
+---------+-----------+---------+-----------+------------+
Run Code Online (Sandbox Code Playgroud)
我不知道我错过了什么.
您WHERE子句中的以下条件负责结果集中缺少的记录:
WHERE plo.stockid = 903958
Run Code Online (Sandbox Code Playgroud)
orderedproducts表中缺少的记录与表中的任何记录都不匹配productsinstocks.因此stockid,此记录的值将是NULL,您当前的WHERE条件将过滤掉它.
相反,OR plo.stockid IS NULL在WHERE子句中添加一个检查以保留此记录:
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)
Run Code Online (Sandbox Code Playgroud)
在这里演示: