2016-01-13 73 views
0

嗨我目前正在編寫一些軟件來管理我們的股票。 我通過2臺MYSQL - 重複

master_stock搜索(存放每一個stockCode和說明) 股票(可容納stockCode,位置,數量...)

一切都很好,但是這是有我的問題IM。

只是說我的股票表中有2條記錄與stockCode爲「testcode」但兩者有不同的位置和quantitys

然後,我有我的master_stock與stockCode 1個實例及其說明

如果我搜索說「測試代碼」,然後生病得到3結果2來自股票這是好的,但我也會得到來自master_stock的一個我想擁有它,所以如果有至少一個結果股票,那麼我不' t想要顯示來自master_stock的行,但是如果在庫存中找不到任何內容,請顯示master_stock中的行。

所以發生了什麼是我返回的結果我並不需要看到這意味着它的速度較慢搜索,這將是令人困惑的員工在看,由於結果的量

SELECT ms.stockCode AS 'Stock Code', 
     ms.description AS 'Description', 
     st.quantity AS 'Quantity', 
     um.UnitMeasurementName AS 'Unit Measurement', 
     dep.departmentName AS 'Location', 
     st .rack AS 'Rack', 
     st.cost AS 'Cost Per Unit', 
     (st.cost * st.quantity) AS 'Total Cost', 
     sc.conditionDescription AS 'Condition' 

FROM stock As st 

INNER JOIN master_stock ms on ms.stockCode = st.stockCode 
INNER JOIN racks r on r.rack= st.rack 
INNER JOIN departments dep on dep.departmentId = r.departmentId 
INNER JOIN unit_measurements um on um.unitMeasurementId = ms.unitMeasurementId 
INNER JOIN stock_conditions sc on sc.conditionId = st.stockCondition 

WHERE ms.stockCode LIKE '%testcode%' 

Union DISTINCT 

SELECT ms.stockCode AS 'Stock Code', 
     ms.description AS 'Description', 
     '0', 
     'NO MEASUREMENT', 
     'NO LOCATION', 
     'NO RACK', 
     '0', 
     '0', 
     'NO CONDITION' 

FROM master_stock As ms 

WHERE ms.stockCode LIKE '%testcode%'; 

回答

0

一種方法是完全放棄工會和使用LEFT從master_stock JOIN代替INNER JOIN:

SELECT ms.stockCode AS 'Stock Code', 
    ms.description AS 'Description', 
    IFNULL(st.quantity, 0) AS 'Quantity', 
    ... 
FROM master_stock as ms 
LEFT JOIN stock as st on ms.stockCode = st.stockCode 
WHERE ms.stockCode LIKE '%testcode% 

這應該爲您提供所有與沒有相應庫存條目的NULL值匹配的主庫存條目。然後,您可以在顯示例程中用常量'NO MEASUREMENT'字符串替換NULL值,或者在SELECT中使用IFNULL表達式返回庫存值爲NULL的'NO MEASUREMENT'。

+0

非常感謝你,這工作得很完美,正是我想讓它工作的原因!不能相信它是如此簡單! – Ashley

0

使用左連接上股票表工會的第二查詢,以確定是否存在庫存表中的條目具有相同的代碼:

... 
union distinct 
SELECT ms.stockCode AS 'Stock Code', 
     ms.description AS 'Description', 
     '0', 
     'NO MEASUREMENT', 
     'NO LOCATION', 
     'NO RACK', 
     '0', 
     '0', 
     'NO CONDITION' 
FROM 
     master_stock as ms 
     LEFT JOIN stock as st on ms.stockCode = st.stockCode 
WHERE ms.stockCode LIKE '%testcode%' and st.stockCode IS NULL;