2011-12-02 55 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