2009-06-13 49 views
3

我有一个希望简单的MySQL查询问题,这个问题在深夜无法解决。我正在尝试做一个SELECT来计算一组数据(订单)的实例数量,并将这些实例按照在父级上存在的值存储在订单本身以上的几个级别中。MySQL多级别父级选择/加入问题

例如:

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 从接单,类别WHERE 订单。 (1,2,3)GROUP BY orders.productId.productGroupId.categoryId中的customer_id

假设有1类产品的订单有17件,2类产品有2件订单,3类有214件订单,所以wha T I很希望得到的回复是:

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

如果我试图通过说PRODUCT_ID我会fine..but两个层次增厚部被扔我组。

谢谢!

回答

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 

对于无类的顺序,计数(orders.id)将返回0,而COUNT(*)将返回一个或更多,这取决于productgroups的数量和产品。

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

+0

的确 - 谢谢! – DarkSquid 2009-06-13 18:56:37