Mysql SQL:COUNT()+;JOIN()按类别(包括空类别)计算项目数

Mysql SQL:COUNT()+;JOIN()按类别(包括空类别)计算项目数,mysql,sql,count,subquery,left-join,Mysql,Sql,Count,Subquery,Left Join,所以,我有两张桌子。有类别的 cat_id || cat_name 1 || cat1 2 || cat2 3 || cat3 一个带物品的 item_id || cat_id 1 || 1 2 || 1 3 || 3 现在,我正在尝试按类别进行传统计数。 在阅读了around()之后,我成功地构建了一个查询,以下面的格式向我返回每个类别的项数 SELECT item.cat_id,

所以,我有两张桌子。有类别的

cat_id || cat_name
   1   ||    cat1
   2   ||    cat2
   3   ||    cat3
一个带物品的

item_id || cat_id
   1   ||    1
   2   ||    1
   3   ||    3
现在,我正在尝试按类别进行传统计数。 在阅读了around()之后,我成功地构建了一个查询,以下面的格式向我返回每个类别的项数

SELECT 
    item.cat_id,
    COUNT(*) item_count
FROM
    item AS item
    JOIN cat as cat
    ON item.cat_id = cat.cat_id
GROUP BY 
    item.cat_id

----------------------
RESULT: 

----------------------
cat_id  || item_count
  1     ||      2
  3     ||      1
----------------------
所以,我这里的问题是,我也想包括没有对象的类别。。。我一直在想,我不知道该怎么办。这种格式的东西:

----------------------
cat_id  || item_count
  1     ||      2
  2     ||      0
  3     ||      1
----------------------
有什么线索吗? 先谢谢你

SQL query to build exemple: 


SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Table structure for table `cat`
--

DROP TABLE IF EXISTS `cat`;
CREATE TABLE IF NOT EXISTS `cat` (
  `cat_id` int(11) NOT NULL,
  `cat_name` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `cat`
--

INSERT INTO `cat` (`cat_id`, `cat_name`) VALUES
(1, 'cat1'),
(2, 'cat2'),
(3, 'cat3');

-- --------------------------------------------------------

--
-- Table structure for table `item`
--

DROP TABLE IF EXISTS `item`;
CREATE TABLE IF NOT EXISTS `item` (
  `item_id` int(11) NOT NULL,
  `cat_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `item`
--

INSERT INTO `item` (`item_id`, `cat_id`) VALUES
(1, 1),
(2, 1),
(3, 1);
COMMIT;
这是一个左连接:

SELECT c.cat_id, COUNT(i.cat_id) AS item_count
FROM cat c
LEFT JOIN item i ON i.cat_id = c.cat_id
GROUP BY c.cat_id
请注意,我使用了表别名来缩短查询,并修复了不相关的表别名
在线

您还可以通过相关子查询获得相同的结果:

SELECT c.cat_id,
    (SELECT COUNT(*) FROM item i WHERE i.cat_id = c.cat_id) AS item_count
FROM cat c

关于性能,考虑一个关于“代码>项目(CasIID)< /C> >的索引。如果你有一个正确声明的外键,它已经在那里了。

< P>这是左连接:

SELECT c.cat_id, COUNT(i.cat_id) AS item_count
FROM cat c
LEFT JOIN item i ON i.cat_id = c.cat_id
GROUP BY c.cat_id
请注意,我使用了表别名来缩短查询,并修复了不相关的表别名
在线

您还可以通过相关子查询获得相同的结果:

SELECT c.cat_id,
    (SELECT COUNT(*) FROM item i WHERE i.cat_id = c.cat_id) AS item_count
FROM cat c

对于性能,考虑一个关于“代码>项目(CasIID)< /C> >的索引。如果你有一个正确声明的外键,它已经在那里了。

< P>一个相关的子查询是一个简单的方法:

select c.*,
       (select count(*)
        from item i
        where i.cat_id = c.cat_id
       ) as item_count
from cat c

关联子查询是一种简单的方法:

select c.*,
       (select count(*)
        from item i
        where i.cat_id = c.cat_id
       ) as item_count
from cat c

您可以使用
sum

select c1.cat_id, sum(c1.cat_id = c2.cat_id) 
from cat c1 
cross join items c2 
group by c1.cat_id

您可以使用
sum

select c1.cat_id, sum(c1.cat_id = c2.cat_id) 
from cat c1 
cross join items c2 
group by c1.cat_id

谢谢你详细完整的回答谢谢你详细完整的回答