2009-06-13 9 views
3

J'ai une question de requête MySQL, je l'espère, qui m'échappe tard dans la nuit. J'essaie de faire un SELECT qui compte le nombre d'instances d'un ensemble de données (ordres) et regroupe ces instances par une valeur qui existe dans un parent à quelques niveaux au-dessus de l'ordre lui-même.MySQL multi-niveau de sélection de parent/question de jointure

Par exemple:

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; 

Ce que je cherche à faire quelque chose dans le quartier de:

nombre SELECT (orders.id), categoryId DE commandes, catégories où commandes. customer_id in (1,2,3) GROUP BY orders.productId.productGroupId.categoryId

En supposant qu'il y ait 17 commandes pour les produits de la catégorie 1, 2 commandes pour les produits de catégorie 2 et 214 commandes pour la catégorie 3, wha t J'espère revenir est:

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

Si je tentais de groupe en dire Product_ID je serais fine..but la partie deux niveaux-up me lancer.

Merci!

Répondre

4

Il suffit de les réunir:

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 

Pour les catégories sans ordre, compter (orders.id) retourne 0, alors que le nombre (*) retournerait un ou plusieurs, en fonction du nombre de Produitgroupes et des produits.

Une jointure interne ne compterait pas les catégories sans les ordres du tout.

+0

En effet - merci! – DarkSquid

Questions connexes