2013-08-16 41 views
1

我想从我的MySQL表中获取一些统计信息,并希望将它保留为单个查询。只是不知道如何(或者甚至可能)。我有两个疑问:将同一表中的查询合并为一个查询

SELECT COUNT(*) AS `accept` 
FROM `status` 
WHERE `groupID` IN (98779,98780) 
    AND `group` = 'order' 
    AND `status` = 'accept' 

SELECT COUNT(*) AS `price` 
FROM `status` 
WHERE `groupID` IN (98779, 98780) 
    AND `group` = 'quotation' 
    AND (`status` = 'final' OR `status` = 'manualprice') 

我最好的建议是,他们在一个单一的SELECT这样的组合:

SELECT 
    (SELECT COUNT(*) AS `accept` 
    FROM `status` 
    WHERE `groupID` IN (98779, 98780) AND `group` = 'order' AND `status` = 'accept') AS accept, 
    (SELECT COUNT(*) AS `price` 
    FROM `status` 
    WHERE `groupID` IN (98779, 98780) AND `group` = 'quotation' AND (`status` = 'final' OR `status` = 'manualprice')) AS price 

有没有更好的办法?

回答

0
SELECT 
    sum(if(`group` = 'order' AND `status` = 'accept', 1,0)) as `accept`, 
    sum(if(`group` = 'quotation' AND (`status` = 'final' OR `status` = 'manualprice'), 1,0)) as `price` 
FROM 
    `status` 
WHERE 
    `groupID` IN (98779,98780) 
    AND `group` IN ('order', 'quotation') 
    AND `status` IN ('accept', 'final', 'manualprice') 

编辑这是基本相同,对方的回答通过491243.我已经使用一个额外的if语句,貌似是不是必需的。

+0

这是非常聪明的......这么好有更多的学习。我能够将我的查询优化10倍。非常感谢! –

1

这里是另一种方式来做到这一点,

SELECT SUM(`group` = 'order' AND `status` = 'accept') AS `ACCEPT`, 
     SUM(`group` = 'quotation' AND (`status` = 'final' OR `status` = 'manualprice')) AS `PRICE` 
FROM `status` 
WHERE `groupID` IN (98779, 98780) AND 
     `group` IN ('order', 'quotation') AND 
     `status` IN ('accept', 'final', 'manualprice')