2009-06-13 8 views
3

Ich habe eine hoffentlich einfache MySQL-Abfrage-Frage, die mich spät in der Nacht entzieht. Ich versuche ein SELECT zu machen, das die Anzahl der Instanzen eines Datensatzes (Orders) zählt und diese Instanzen mit einem Wert gruppiert, der in einem Elternteil einige Ebenen über dem Auftrag selbst existiert.MySQL Multi-Level-Elternauswahl/beitreten Frage

Zum Beispiel:

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; 

Was ich suche, etwas zu tun in der Nähe von:

SELECT count (orders.id), categoryId von den Aufträgen, Kategorien, in denen Aufträgen. customer_id in (1,2,3) GROUP BY orders.productId.productGroupId.categoryId

Angenommen, es gibt 17 Bestellungen für Produkte der Kategorie 1, 2 Bestellungen für Produkte der Kategorie 2 und 214 Bestellungen für die Kategorie 3, wha t Ich bin der Hoffnung, wieder zu bekommen ist:

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

Wenn ich versuchte, zu einer Gruppe von sagen product_id ich fine..but die Zweistufen-up Teil mich wirft sein würde.

Danke!

Antwort

4

kommen sie einfach zusammen:

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 

Für die Kategorien ohne Auftrag, count (orders.id) 0 zurück, während count (*) würde eine oder mehr zurückkehren, abhängig von der Anzahl der Produktgruppen und Produkte.

Eine innere Verknüpfung würde keine Kategorien ohne Aufträge zählen.

+0

In der Tat - danke! – DarkSquid