2013-07-23 156 views
0

我正在直接與Magento數據庫一起工作,嘗試獲取訂單狀態爲Shipped的所有訂單的列表,但不包括支付的訂單用於通過電匯(bankpayment)。這裏是我當前的查詢:獲取所有未按「發貨」狀態付款的訂單

SELECT * FROM (
    SELECT 
    so.entity_id, 
    so.created_at, 
    MAX(soe.created_at) AS shipped_at 
    FROM sales_order so 
    LEFT OUTER JOIN sales_order_entity soe 
    ON (soe.parent_id=so.entity_id) 
    LEFT OUTER JOIN sales_order_entity_varchar soev 
    ON (soev.entity_id = soe.entity_id) 
    AND (soev.value <> 'bankpayment') 
    WHERE (soev.value = 'shipped') 
    GROUP BY so.entity_id) AS shipped 
WHERE (shipped.shipped_at >= '2013-05-01 04:00:00') 
AND (shipped.shipped_at <= '2013-05-02 03:59:59'); 

我不是一個真正的SQL專家,你能看到我試圖選擇電匯這一行不支付的訂單:

AND (soev.value <> 'bankpayment')

但預期它不工作,我懷疑它做的WHERE條款:

WHERE (soev.value = 'shipped')

我不知道如何正確編寫此查詢。有什麼建議?

注意 - 在這種情況下,我無法使用Magento模型/集合來收集數據。

回答

0

您正在查找的公司有'shipped'但不是'bankpayment'。你想在不同的行上尋找這些值。換句話說,你想接受一個有'shipped'的行的實體',但是隻有在沒有行的時候纔有'bankpayment'

您可以在having子句中執行此邏輯。那麼,你還沒有一個having條款。你有一個在外面有where子句的子查詢。雖然這是等價的,但我正在簡化查詢以消除子查詢。然後,我使用having子句檢查日期和兩個值的存在/不存在:

SELECT so.entity_id, so.created_at, 
     MAX(soe.created_at) AS shipped_at 
FROM sales_order so LEFT OUTER JOIN 
    sales_order_entity soe 
    ON soe.parent_id = so.entity_id LEFT OUTER JOIN 
    sales_order_entity_varchar soev 
    ON soev.entity_id = soe.entity_id 
GROUP BY so.entity_id 
having MAX(soe.created_at) >= '2013-05-01 04:00:00' AND 
     MAX(soe.created_at) <= '2013-05-02 03:59:59' and 
     SUM(soev.value = 'shipped') > 0 and 
     sum(soev.value = 'bankpayment') = 0; 
+0

這按預期工作。我也喜歡你教給我一些關於如何以及何時使用「擁有」條款的內容。謝謝! –

相關問題