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
谢谢你详细完整的回答谢谢你详细完整的回答