2011-12-02 50 views
0
<?php 
    $inventory_in = $db->get_one("SELECT COALESCE(SUM(Qty), 0) 
        FROM inventory Where id=12 AND inv_type = 'in' LIMIT 1"); 

    $inventory_out = $db->get_one("SELECT COALESCE(SUM(Qty), 0) 
        FROM inventory Where id=12 AND inv_type = 'out' LIMIT 1"); 

    $inventory = $inventory_in - $inventory_out; 
?> 

可能將兩個查詢合併爲一個根據mysql中不同條件選擇兩列

謝謝。

+0

什麼是你爲希望將它們合併動機是什麼?通常,一個複雜的查詢比多個簡單的查詢慢。 – drewish

+0

@drewish我的經歷完全相反。在這個例子中,兩次執行聚合(簡單)比同時執行兩次(複雜)要昂貴。這個概念的複雜性與性能直接相關,它也很容易得到'SELECT N + 1'問題。在任何情況下,當它更好地瞭解你的預算是什麼,並衡量你是否達到了預算。關於什麼會更好的假設是一個壞主意 –

+0

@ConradFrix是的,我想我更一般地說,在彙總的情況下,你可能是正確的,單次傳球是最好的,但像你說的測試它假設。這就是爲什麼我試圖弄清楚動機是什麼。 – drewish

回答

2

假設你要這兩個值輸出,您可以用SUM/CASE

SELECT 
     COALESCE(SUM(CASE WHEN inv_type = 'in' THEN Qty ELSE 0 END), 0) as Sum1, 
     COALESCE(SUM(CASE WHEN inv_type = 'out' THEN Qty ELSE 0 END), 0) as Sum2 
FROM inventory 
WHERE id=12 
LIMIT 1 

您可能需要添加and inv_type in ('in', 'out')到您的where子句,但它不是必需的。

0

有條件和怎麼樣?

SELECT 
    SUM(CASE WHEN inv_type = 'in' THEN 1 ELSE 0 END) InSum 
    SUM(CASE WHEN inv_type = 'out' THEN 1 ELSE 0 END) OutSum 
WHERE 
    id = 12 

或者,如果你只是想要的結果

SELECT 
    SUM(CASE inv_type WHEN 'in' THEN 1 WHEN 'out' THEN -1 ELSE 0 END) TotalSum 
WHERE 
    id = 12 
0
SELECT inv_type, COALESCE(SUM(Qty), 0) 
FROM inventory 
WHERE id=12 AND inv_type IN ('in', 'out') 
GROUP BY inv_type