MySQL查询从表计数总数中选择并使用,计算剩余

时间:2015-08-22 04:18:02

标签: mysql count group-by

我有两张桌子:

-- **phones**

CREATE TABLE IF NOT EXISTS `phones` (
`phone_id` int(11) NOT NULL AUTO_INCREMENT,
`phone_type_id` int(11) NOT NULL,
`phone_mac` varchar(255) NOT NULL,
`office_id` int(11) DEFAULT NULL,
`did_id` int(11) DEFAULT NULL,
`virtual_extension_id` int(11) DEFAULT NULL,
PRIMARY KEY (`phone_id`),
UNIQUE KEY `phone_mac` (`phone_mac`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=67 ;

INSERT INTO `phones` (`phone_id`, `phone_type_id`, `phone_mac`, `office_id`, `did_id`, `virtual_extension_id`) VALUES
(1, 1, '0004f22ccccc', 5, NULL, NULL),
(63, 1, '0004f22bbbbb', 9, 33, NULL),
(64, 20, '0004f22aaaaa', 6, NULL, 6600),
(65, 2, '000033434333', 9, NULL, NULL),
(66, 20, '21232da32434', 6, NULL, NULL);

--  **phone_types**

CREATE TABLE IF NOT EXISTS `phone_types` (
  `phone_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_type_manufacturer` varchar(255) NOT NULL,
  `phone_type_model` varchar(255) NOT NULL,
  PRIMARY KEY (`phone_type_id`),
  UNIQUE KEY `phone_type_model` (`phone_type_model`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ;

INSERT INTO `phone_types` (`phone_type_id`, `phone_type_manufacturer`, `phone_type_model`) VALUES
(1, 'Polycom', 'SoundPoint IP 550'),
(2, 'Polycom', 'SoundPoint IP 450'),
(3, 'Polycom', 'SoundPoint IP 335'),
(4, 'Polycom', 'SoundPoint IP 560'),
(5, 'Polycom', 'SoundPoint IP 670'),
(6, 'Polycom', 'SoundStation IP 5000'),
(7, 'Polycom', 'SoundStation IP 6000'),
(8, 'Yealink', 'W52P'),
(20, 'Aastra', '6757i CT');

我可以从phone_types表中选择所有手机,然后在手机表phone_type_id列中获取这些手机中有多少手机的总数。

我需要计算这些手机中有多少手机在电话表中有一个值(NOT NULL),在did_id或virtual_extension_id中。这就是我挂断电话的地方。

这是我到目前为止所拥有的。请注意,我目前使用相同的总计数并使用,因为我无法计算使用的计数。任何帮助是极大的赞赏。 提前谢谢。

SELECT 
phone_types.phone_type_id AS phone_type_id, 
phone_type_manufacturer AS phone_type_manufacturer, 
phone_type_model AS phone_type_model, 
COUNT( phones.phone_type_id ) AS total_count, 
COUNT( phones.phone_type_id ) AS used_count
FROM  phone_types 
LEFT JOIN phones ON phones.phone_type_id = phone_types.phone_type_id
GROUP BY phone_types.phone_type_id

示例输出:

    1 | Polycom | SoundPoint IP 550    | 2 | 2
    2 | Polycom | SoundPoint IP 450    | 0 | 0
    3 | Polycom | SoundPoint IP 335    | 0 | 0
    4 | Polycom | SoundPoint IP 560    | 0 | 0
    5 | Polycom | SoundPoint IP 670    | 0 | 0
    6 | Polycom | SoundStation IP 5000 | 0 | 0
    7 | Polycom | SoundStation IP 6000 | 0 | 0
    8 | Yealink | W52P                 | 0 | 0
   20 | Aastra  | 6757i CT             | 1 | 1

已编辑:添加了创建和插入语句。

编辑:似乎正在取得进展。

选择phone_types.phone_type_manufacturer,phone_types.phone_type_model,COUNT(phones.phone_type_id)AS总计,COUNT(phones.did_id OR virtual_extension_id)AS已使用 来自phones INNER JOIN phone_types ON phones.phone_type_id = phone_types.phone_type_id GROUP BY phones.phone_type_id

给出了以下输出: 制造商型号总计二手 Polycom Soundpoint IP 550 2 1 Polycom SoundPoint IP 450 1 0 Aastra 6757i CT 2 1

这是正确的,但是我需要显示其他手机在did_id和virtual_extension_id中都有NULL值吗?

1 个答案:

答案 0 :(得分:0)

我想你是在这样的事情之后......虽然我真的不明白你的数据集如何与你的结果集相符?!?!

SELECT t.phone_type_id
     , t.phone_type_manufacturer
     , t.phone_type_model
     , COUNT(COALESCE(did_id,virtual_extension_id)) x
  FROM phone_types t 
  LEFT 
  JOIN phones p 
    ON p.phone_type_id = t.phone_type_id
 GROUP 
    BY t.phone_type_id;