MySQL 从 table 中查询 Select 计数总数和已使用,计算剩余

MySQL Query Select from table count total and used, calculate remaining

我有两个 tables :

-- **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');

我能够 select 来自 phone_types table 的所有电话,然后得到电话 table 中这些电话的总数, phone_type_id 列。

我需要计算这些电话中有多少在电话 table、did_id 或 virtual_extension_id 中具有值(NOT NULL)。这就是我挂断电话的地方。

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

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

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

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

SELECT phone_types.phone_type_manufacturer, phone_types.phone_type_model, COUNT( phones.phone_type_id ) 总计, COUNT( phones.did_id 或 virtual_extension_id ) 按原样使用 来自 phones 内部联接 phone_types 在 phones.phone_type_id = phone_types.phone_type_id 分组依据 phones.phone_type_id

这给了我以下输出: 制造商型号总计二手 宝利通声点 IP 550 2 1 宝利通 SoundPoint IP 450 1 0 Aastra 6757i CT 2 1

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

我猜你正在寻找这样的东西......虽然我不太明白你的数据集如何与你的结果集相吻合?!?!

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;