SQL - 如何获取所有子类别产品incl。自我产品

时间:2016-02-23 07:59:45

标签: mysql sql database select

我的数据库存在问题,希望您能帮我解决这个问题。

我有这样的表:

categories 
--------------------
|id | name | parent|
____________________

categories_x_products (m:n)
---------------------
|id | ctg_id | p_id |
---------------------

products
------------
| id, name |
------------

我的问题是:"如何获得我的所有&子类别产品数量?" 例如:

类:

id = 1, name = computers, parent = 0 (1 product)
id = 2, name = notebooks, parent = 1 (2 products)

我希望得到

computers : 3
notebooks : 2

我试试这个但是没有工作

select a.name, count(b.id)
FROM categories a
LEFT JOIN categories x ON x.id=a.parent
LEFT JOIN category_x_product b ON b.ctg_id=a.id
group by a.id

感谢您的回答。

以下是一些示例数据:

-- Adminer 4.2.3 MySQL dump

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `parent` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `categories` (`id`, `name`, `parent`) VALUES
(1,     'computers',    0),
(2,     'notebooks',    1),
(3,     'lenovo',       2);

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `products` (`id`, `name`) VALUES
(1,     'lenovo thinkpad 001'),
(2,     'lenovo thinkpad 002'),
(3,     'lenovo thinkpad 003'),
(4,     'lenovo thinkpad 004'),
(5,     'lenovo thinkpad 005'),
(6,     'random comp.');

DROP TABLE IF EXISTS `product_x_category`;
CREATE TABLE `product_x_category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) DEFAULT NULL,
  `category_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `product_x_category` (`id`, `product_id`, `category_id`) VALUES
(1,     1,      3),
(2,     2,      3),
(3,     3,      3),
(4,     4,      3),
(5,     5,      3),
(6,     6,      1);

-- 2016-02-23 08:16:30

1 个答案:

答案 0 :(得分:1)

我尝试运行SQL查询(创建表并插入值)。

我运行此查询

SELECT a.name, COUNT( b.id ) 
FROM categories a
LEFT JOIN product_x_category b ON b.category_id = a.id
GROUP BY a.id

然后它返回

enter image description here

这是您的 product_x_Category 表格(其中category_id - > 3 = lenovo和category_id - > 1 =计算机)

enter image description here

我认为结果是你想要的,不是吗?