mysql - 在sql中获取与嵌套类别相关的项目数

标签 mysql sql

我有两个表:类别和项目。我使用嵌套集结构存储类别。类别有项目。项目只能添加到根类别的叶节点。

例如: 类别

Vehicles
    Bikes
        Bajaj
    Automobiles
Art & Antiques
    Amateur Art

在这种情况下,可以将项目添加到类别 Bajaj、汽车和业余艺术。

假设 Bajaj 中有 2 个项目,Automobiles 中有 5 个项目,Amateur Art 中有 2 个

对于根级别类别,我想显示如下:

- Vehicles (7 items)
- Art & Antiques (2 items)

我该怎么做?

这是处理一些示例数据的 sql 转储

--
-- Table structure for table `categories`
--

CREATE TABLE IF NOT EXISTS `categories` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent_id` int(11) DEFAULT NULL,
 `title` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
 `lft` int(11) NOT NULL,
 `lvl` int(11) NOT NULL,
 `rgt` int(11) NOT NULL,
 `root` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
   KEY `IDX_3AF34668727ACA70` (`parent_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=28 ;

--
 -- Dumping data for table `categories`
--

INSERT INTO `categories` (`id`, `parent_id`, `title`, `lft`, `lvl`, `rgt`, `root`)  VALUES
(22, NULL, 'Vehicles', 1, 0, 8, 22),
(23, 22, 'Bikes', 2, 1, 5, 22),
(24, 23, 'Bajaj', 3, 2, 4, 22),
(25, 22, 'Automobiles', 6, 1, 7, 22),
(26, NULL, 'Art & Antiques', 1, 0, 4, 26),
(27, 26, 'Amateur Art', 2, 1, 3, 26);

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

--
-- Table structure for table `items`
--

CREATE TABLE IF NOT EXISTS `items` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `category_id` int(11) NOT NULL,
 `title` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `FK_403EA91BA33E2D84` (`category_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `items`
--

INSERT INTO `items` (`id`, `category_id`, `title`) VALUES
(1, 24, 'Pulsor 150 cc'),
(2, 24, 'Discover 125 cc'),
(3, 27, 'Art of dream'),
(4, 25, 'Toyota Car');

--
-- Constraints for dumped tables
--

--
-- Constraints for table `categories`
--
ALTER TABLE `categories`
 ADD CONSTRAINT `FK_3AF34668727ACA70` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`) ON DELETE SET NULL;

--
-- Constraints for table `items`
--
ALTER TABLE `items`
 ADD CONSTRAINT `FK_403EA91BA33E2D84` FOREIGN KEY (`category_id`) REFERENCES  `categories` (`id`) ON DELETE CASCADE;

根节点的parent_id字段为NULL

更新:

我能够使用此查询获取根:

SELECT c.id,c.title,cte.co FROM categories c
JOIN 
(SELECT 
  c0_.id,c0_.root,COUNT(i.id) co
  FROM 
  categories c0_ 
  JOIN items i ON c0_.id=i.category_id
  WHERE c0_.rgt = 1 + c0_.lft
  GROUP BY c0_.id
) cte
ON cte.root=c.id
WHERE c.parent_id is null

以上查询适用于根级别类别。现在,当用户点击根级别类别时,我也想这样做。

例如,当有人点击车辆时,我应该得到:

 Bikes (2)
 Automobiles (5)

为此我尝试了:

 SELECT c.id,c.title,cte.co FROM categories c
 JOIN 
 (SELECT 
   c0_.id,c0_.root,COUNT(i.id) co
  FROM 
  categories c0_ 
  JOIN items i ON c0_.id=i.category_id
  WHERE 
  c0_.rgt = 1 + c0_.lft
  GROUP BY c0_.id
 ) cte
 ON cte.root=c.id
 WHERE c.parent_id=1

这返回了空结果集。这个查询有什么问题?

最佳答案

SELECT parent.title,
( SELECT count(i.id) count FROM items i 
 WHERE category_id IN 
 (
 SELECT child.id FROM categories child WHERE child.lft>=parent.lft AND   
  child.rgt<=parent.rgt AND child.root=parent.root
 )
)
FROM categories parent 
WHERE parent.parent_id=@parent_id;

如果不行请通知我

关于mysql - 在sql中获取与嵌套类别相关的项目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457030/

相关文章:

sql - T-SQL 按条件对数据进行分组

java.lang.NumberFormatException : For input string ComboBox

SQL:如何查找是否至少有一条记录与条件匹配

mysql - 从两个不同的表中检索的 SQL 连接问题

php - 计算mysql查询中的行数

MySQL 150 错误

mysql - 如何将选择子查询重构为联接?

sql - 如何在 b 中没有函数 (a) 的情况下连接表

PHP:点击添加按钮后购物车为空

mysql select *Where 并从一个字段获取服装行