将同一个表上的查询合并到一个查询中

时间:2013-08-16 12:02:49

标签: mysql optimization

我正在尝试从我的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

有更好的方法吗?

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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语句,看似不一定需要。

相关问题