MySQL多级父选择/加入问题

时间:2009-06-13 08:14:09

标签: sql syntax select

我有一个希望简单的MySQL查询问题,它在深夜让我望而却步。我正在尝试执行一个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 FROM订单,类别WHERE order.customer_id in(1,2,3)GROUP BY orders.productId.productGroupId.categoryId

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

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

如果我试图通过说product_id进行分组,我会没事的。但是这个两个级别的部分正在抛弃我。

谢谢!

1 个答案:

答案 0 :(得分:4)

加入他们:

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(*)将返回一个或多个,具体取决于产品组和产品的数量。

内连接根本不会计算没有订单的类别。