2014-01-23 97 views
4

我有三個表格: - - 訂單(給我訂單日期) - 訂單行項目(使我能夠將活動結果鏈接到訂單日期) - 活動項目(給我的活動結果)MySQL - 加入兩個查詢(UNION?)

我試圖在圖形上繪製的效果,並能成功地創造減去所有結果的數組< = 50爲使用以下查詢通過: -

SELECT 
    YEAR(od_date) AS Year, 
    MONTH(od_date) AS Month, 
    test_name, 
    pd_name, 
    COUNT(test_result) AS Passed 
FROM tbl_lab_item 
    INNER JOIN tbl_order_item 
    ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id 
    INNER JOIN tbl_order 
    ON tbl_order.od_id = tbl_order_item.od_id 
WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH) 
    AND test_name = 'Test' 
    AND pd_name = 'Product' 
    AND test_result <= 50 
    AND od_customer_id = '4' 
GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC 

我可以使用相同的查詢但使用Count(test_result)對失敗結果執行類似操作, AS在選擇中失敗,並將WHERE條件更改爲> 50。

我想在一個查詢中完成另外兩件事情,如果可能的話。

首先,我希望能夠將通過和失敗結合到相同的查詢中,以便得到月份,通過次數和失敗次數。其次,爲了在圖表上繪製所有這些,我可能需要顯示所有月份,即使在Passes,Fails或兩者都沒有結果的情況下也是如此。從我對UNION的理解來看,這些查詢需要具有相同的形狀,所以我可以將一個Null作爲失敗添加到Pass查詢中,反之亦然,但是我怎樣才能將它合併爲一個讓所有月份顯示的方法?

我已經在這裏看過How to get a count even if there are no results corresponding mysql?以獲得所有的月份顯示,但是我沒有知識將其整合到我的查詢中。

希望這一切都有意義嗎?

回答

0

試試這個:

SELECT YEAR(od_date) AS `Year`, MONTH(od_date) AS `Month`, test_name, pd_name, 
     SUM(test_result <= 50) AS Passed, SUM(test_result > 50) AS Failes 
FROM tbl_lab_item li 
INNER JOIN tbl_order_item oi ON oi.od_item_id = li.od_item_id 
INNER JOIN tbl_order o ON o.od_id = oi.od_id 
WHERE o.od_date >= DATE_SUB(NOW(), INTERVAL 12 MONTH) AND test_name = 'Test' AND 
     pd_name = 'Product' AND od_customer_id = '4' 
GROUP BY test_name, YEAR(od_date), MONTH(od_date) ASC 
+0

這個作品謝謝你,但只顯示結果存在的月份。即使當月沒有「通行證」或「失敗」,是否還有強制顯示所有12個月的方法? – Jason

+0

這個答案讓我最接近我期望的解決方案,並且是我最終使用的一個:) – Jason

0

對於通過和失敗,你可以做到這一點

SELECT 
    YEAR(od_date) AS Year, 
    MONTH(od_date) AS Month, 
    test_name, 
    pd_name, 
    SUM(IF(test_result <= 50 , 1 , 0)) AS Passed, 
    SUM(IF(test_result > 50 , 1 , 0)) AS Failed 
FROM tbl_lab_item 
    INNER JOIN tbl_order_item 
    ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id 
    INNER JOIN tbl_order 
    ON tbl_order.od_id = tbl_order_item.od_id 
WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH) 
    AND test_name = 'Test' 
    AND pd_name = 'Product' 
    AND od_customer_id = '4' 
GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC 

卸下where子句條件,將其在選擇

對於第二部分創建表月

id | month 
------------------- 
    1 | 1 
    1 | 2 
    1 | 3  
    1 | 4  
    1 | 5  
    1 | 6  
    1 | 7  
    1 | 8  
    1 | 9  
    1 | 10  
    1 | 11  
    1 | 12  

現在加入它

SELECT 
    YEAR(od_date) AS Year, 
    MONTH(od_date) AS Month, 
    test_name, 
    pd_name, 
    SUM(IF(test_result <= 50 , 1 , 0)) AS Passed, 
    SUM(IF(test_result > 50 , 1 , 0)) AS Failed 
FROM tbl_lab_item 
    INNER JOIN tbl_order_item 
    ON tbl_order_item.od_item_id = tbl_lab_item.od_item_id 
    INNER JOIN tbl_order 
    ON tbl_order.od_id = tbl_order_item.od_id 
    LEFT JOIN month ON months.month = MONTH(tbl_lab_item.od_date) 
WHERE tbl_order.od_date >= DATE_SUB(now(), INTERVAL 12 MONTH) 
    AND test_name = 'Test' 
    AND pd_name = 'Product' 
    AND od_customer_id = '4' 
GROUP BY test_name, YEAR(od_date), MONTH(od_date)ASC 
+0

感謝您的支持。我可以看到邏輯,但是我得到一個表'Month'不存在的錯誤。我認爲你希望獲得結果加入「AS月」部分,但似乎沒有。 – Jason

+0

我說創建一個表,其中將有一個名爲月 –

+0

列啊,我這樣做,雖然稱爲「月」,根據您的文章。我會再嘗試。 – Jason