MySQL многоуровневый родительский выбор / вопрос присоединения - PullRequest
3 голосов
/ 13 июня 2009

Надеюсь, у меня простой вопрос 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 ОТ заказов, категории ГДЕ 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, я был бы в порядке ... но часть с двумя уровнями выбрасывает меня.

Спасибо!

1 Ответ

4 голосов
/ 13 июня 2009

Просто соедините их вместе:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...