Вопрос о многоуровневом родительском выборе/присоединении MySQL

У меня есть, надеюсь, простой вопрос запроса 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;

То, что я хочу сделать, это что-то в районе:

ВЫБЕРИТЕ количество (orders.id), categoryId FROM заказов, категории WHERE orders.customer_id в (1,2,3) GROUP BY orders.productId.productGroupId.categoryId

Предполагая, что есть 17 заказов на продукты в категории 1, 2 заказа на продукты в категории 2 и 214 заказов на товары в категории 3, я надеюсь получить обратно:

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

Если бы я пытался сгруппировать, скажем, product_id, я был бы в порядке ... но часть с двумя уровнями меня бросает.

Спасибо!


person DarkSquid    schedule 13.06.2009    source источник


Ответы (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(*) вернет один или несколько, в зависимости от количества групп продуктов и продуктов.

Внутреннее соединение вообще не будет учитывать категории без заказов.

person Andomar    schedule 13.06.2009