[英]MYSQL combine and select rows by two reference tables
我對這個問題迷失了方向,研究沒有幫助。 因此,這是一種反模式嗎?難嗎?還是我...
這里的IDEA是,對於使用的每種物料,我們只有一個表格,我們有多個物料存放在其中的存儲架。 每個庫存都有單獨的數量和最小限制。
我要實現的是一個輸出以下內容的SQL查詢:
+-------+------+---------------------+----------+-----------------+
| SL_Id | M_Id | TimeCreated | Quantity | MinimumQuantity |
+-------+------+---------------------+----------+-----------------+
| 1 | 2 | 2017-11-02 13:04:18 | 10 | 5 |
| 1 | 3 | NULL | NULL | 15 |
| 1 | 4 | 2017-11-02 15:56:56 | 7 | NULL |
+-------+------+---------------------+----------+-----------------+
這就是我現在的位置。
+-------+------+---------------------+----------+-----------------+
| SL_Id | M_Id | TimeCreated | Quantity | MinimumQuantity |
+-------+------+---------------------+----------+-----------------+
| 1 | 2 | 2017-11-02 13:04:18 | 10 | NULL |
| 1 | 3 | NULL | NULL | 15 |
| 1 | 4 | 2017-11-02 15:56:56 | 7 | NULL |
+-------+------+---------------------+----------+-----------------+
表格如下:
材料
+----+-----------+
| Id | OrderCode |
+----+-----------+
| 2 | asdf |
| 3 | 75424 |
| 4 | 45567 |
+----+-----------+
庫存位置
+----+-------+
| Id | Label |
+----+-------+
| 1 | asdf |
+----+-------+
庫存
+----+------------------+-------------+---------------------+----------+
| Id | StockLocation_Id | Material_Id | TimeCreated | Quantity |
+----+------------------+-------------+---------------------+----------+
| 1 | 1 | 2 | 2017-11-02 13:04:18 | 10 |
| 2 | 1 | 4 | 2017-11-02 15:23:26 | 9 |
| 3 | 1 | 4 | 2017-11-02 15:56:56 | 7 |
+----+------------------+-------------+---------------------+----------+
庫存位置物料限制
+----+------------------+-------------+-----------------+
| Id | StockLocation_Id | Material_Id | MinimumQuantity |
+----+------------------+-------------+-----------------+
| 1 | 1 | 2 | 5 |
| 2 | 1 | 3 | 15 |
+----+------------------+-------------+-----------------+
這是失敗背后的怪物,
SELECT
SL_Id,
M_Id,
TimeCreated,
Quantity,
MinimumQuantity
FROM (
SELECT
SL.Id AS SL_Id,
M.Id AS M_Id,
I.TimeCreated AS TimeCreated,
I.Quantity AS Quantity,
NULL AS MinimumQuantity
FROM StockLocation SL, Material M
JOIN Inventory I on I.Id = (
SELECT Id FROM Inventory I1 WHERE I1.StockLocation_Id=SL.Id AND I1.Material_Id=M.Id ORDER BY I1.TimeCreated DESC LIMIT 1
)
UNION
SELECT
SL.Id AS SL_Id,
M.Id AS M_Id,
NULL AS TimeCreated,
NULL AS Quantity,
SLML.MinimumQuantity AS MinimumQuantity
FROM StockLocation SL, Material M
JOIN StockLocationMaterialLimit SLML on SLML.Id = (
SELECT Id FROM StockLocationMaterialLimit SLML1 WHERE SLML1.StockLocation_Id=SL.Id AND SLML1.Material_Id=M.Id LIMIT 1
)
) tst GROUP BY SL_Id,M_Id
事實證明,就像在產生NULL值的那些字段上添加MAX()一樣容易。
SELECT
M_Id,
SL_Id,
TimeCreated,
MAX(Quantity) AS Quantity,
MAX(MinimumQuantity) AS MinimumQuantity
FROM (
SELECT
M.Id AS M_Id,
SL.Id AS SL_Id,
I.TimeCreated AS TimeCreated,
I.Quantity AS Quantity,
NULL AS MinimumQuantity
FROM StockLocation SL, Material M
INNER JOIN Inventory I on I.Id = (
SELECT Id FROM Inventory I1 WHERE I1.StockLocation_Id=SL.Id AND I1.Material_Id=M.Id ORDER BY I1.TimeCreated DESC LIMIT 1
)
UNION
SELECT
M.Id AS M_Id,
SL.Id AS SL_Id,
NULL AS TimeCreated,
NULL AS Quantity,
SLML.MinimumQuantity AS MinimumQuantity
FROM StockLocation SL, Material M
INNER JOIN StockLocationMaterialLimit SLML on SLML.Id = (
SELECT Id FROM StockLocationMaterialLimit SLML1 WHERE SLML1.StockLocation_Id=SL.Id AND SLML1.Material_Id=M.Id LIMIT 1
)
) tst GROUP BY SL_Id, M_Id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.