一尘不染

MySQL多级父级选择/联接问题

sql

我有一个希望很简单的MySQL查询问题,在深夜使我难以理解。我正在尝试执行SELECT,该SELECT计算一组数据(订单)的实例数量,并通过在订单本身上方几层的父级中存在的值对这些实例进行分组。

例如:

CREATE TABLE  `so_test`.`categories` (
  `id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`product_group` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `category_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`products` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `product_group_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

CREATE TABLE  `so_test`.`orders` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `product_id` int(10) unsigned NOT NULL auto_increment,
  `customer_id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=572395 DEFAULT CHARSET=latin1;

我正在寻找的是以下附近的东西:

SELECT count(orders.id),categoryId来自订单,类别(1,2,3)中的WHERE
order.customer_id,GROUP BYorders.productId.productGroupId.categoryId

假设类别1的产品有17个订单,类别2的产品有2个订单,类别3的产品214个订单,我希望能得到的是:

count(orders.id), categoryId
============================
      17              1
      2               2
      214             3

如果我想按product_id分组,那很好。.但是两层向上的部分正在抛出我。

谢谢!


阅读 140

收藏
2021-03-08

共1个答案

一尘不染

只需将它们一起加入:

select categoryid, count(orders.id)
from category c
left join product_group pg on pg.category_id = c.id
left join products on p on p.product_group_id = pg.id
left join orders o on o.product_id = p.id

对于没有订单的类别,count(orders.id)将返回0,而count(*)将返回一个或多个,这取决于产品组和产品的数量。

内部联接根本不计算没有订单的类别。

2021-03-08