2009-08-20 19 views
0

Ich habe eine einfache Frage, aber ich weiß nicht, welchen Begriff ich verwenden sollte, um die Antwort zu finden (Englisch ist nicht meine Muttersprache).Produkte Kategorien

Ich habe eine klassische Datenbank-Design von Produkten wie und Kategorien.

CREATE TABLE IF NOT EXISTS `a` (
    `id_a` int(11) NOT NULL auto_increment, 
    `type` varchar(255) NOT NULL, 
    PRIMARY KEY (`id_a`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

CREATE TABLE IF NOT EXISTS `b` (
    `id_b` int(11) NOT NULL, 
    `id_a` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`id_b`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Wo b.id_a ein Fremdschlüssel ist zu a.id_a

Ich möchte eine Hierarchie aller thoses bekommen wie

ein Wert 1

  • b_value_1
  • b_value_2

ein Wert 2

  • b_value_11
  • b_value_12

Ein Wert 3

  • b_value_21
  • b_value_22
  • b_value_23

Der Antrag macht die Sache nicht, aber ich erhalte diese Art von anwser:

VALUEOF-TABLE-A | VALUEOF-TABLE-B 
A VALUE 1  | b_value_1 
A VALUE 1  | b_value_2 

und so weiter.

Mein aktueller Code ist so etwas wie:

$categ = ''; 
while ($row = mysql_fetch_row ($ressource)) 
{ 
    if ($row['VALUEOF-TABLE-A']!=$categ) 
    { 
    $categ = $row['VALUEOF-TABLE-A']; 
    echo '<h3>', $categ, '</h3>'; 
    } 
    echo '<h4>', $row['VALUEOF-TABLE-B'], '</h4>'; 
} 

Aber Ich mag nicht viel, die Idee der categ Variable, sei es eine Zeichenfolge oder eine ID. Gibt es eine andere Möglichkeit, die Daten zu erhalten und anzuzeigen?

Idealerweise bin ich wie ein Baumobjekt und habe nur einen Knoten für identische Kinder.

Ich hoffe, Sie verstanden, was ich will.

Antwort

1

Wenn Sie in Mysql mit Fremdschlüsseln arbeiten, sollten Sie anstelle von MyISAM die InnoDB-Engine verwenden.

Es scheint ein Problem in der Konzeption der b-Tabelle zu geben, id_b sollte der Primärschlüssel sein, nicht id_a.

Ihr Problem zu lösen, sollten Sie vielleicht zuerst die Liste der id_a abrufen, dann eine Auswahlanforderung machen, indem id_a die entsprechenden id_b mit einem JOIN auszuwählen.

EDIT: das Skript wie folgt mit etwas mehr Präsentation aussehen soll:

$category_array = mysql_query("SELECT id_a, type FROM a"); 
while ($category = mysql_fetch_array($category_array)) 
{ 
    echo $category['type']; 
    $product_array = mysql_query("SELECT * FROM b WHERE id_a = $id_a"); 
    while ($product = mysql_fetch_array($product_array)) 
    { 
     echo $product['name']; 
    } 
} 
+0

Sie haben Recht, der Schlüssel ist id_b, aber ich habe die Tabelle Reihenfolge in meinem Beitrag vertauscht und vergessen. Die Anfrage ist eine implizite Join: Es ist eine Art von wählen a.name, b.type aus table_a a, table_b b wobei a.id_a = b.id_a – Aif

+0

Ich fügte ein kleines Skript, ich habe es nicht getestet, aber die Struktur sollte stimmen. –

+0

Ja, danke, dies war die zweite Lösung, von der ich sprach (naja, eigentlich scheint es, dass ich es nicht getan habe), aber mein Ziel war es, diese Art von Dingen durchzuführen, ohne eine Abfrage für jede Kategorie zu machen. – Aif

1

Das Beispiel Chico ist auf dem richtigen Weg gibt, hat aber ein Problem: wenn es viele Kategorien, auch wird das Skript viele Abfragen ausführen, was ineffizient ist. Das folgende Beispiel ist viel effizienter:

$categories = array(); 
$category_array = mysql_query("SELECT id_a, type FROM a"); 
while ($category = mysql_fetch_array($category_array)) 
{ 
    $category['products'] = array(); 
    $categories[$category['id_a']][] = $category; 
} 

$product_array = mysql_query("SELECT * FROM b"); 
while ($product = mysql_fetch_array($product_array)) 
{ 
    $categories[$product['id_a']]['products'][] = $product 
} 

foreach($categories as $category) { 
    echo $category['type']; 
    foreach ($category['products'] as $product) { 
     echo $product['name']; 
    } 
} 

Als zusätzlichen Bonus, diese trennt auch den Abruf der Daten mehr sauber von dem Ausgang.

+0

Danke für die Antwort, aber ich finde es nicht wirklich besser als meine erste Idee. Ich denke, ich sollte meine erste Idee behalten und die ID der vorherigen Kategorie und eine Variable der aktuellen Kategorie-ID beibehalten und sie vergleichen. – Aif

Verwandte Themen