2009-08-24 10 views
4

Ich habe Probleme mit Unterkategorien.Unterkategorien MySql und php

Ich möchte dies mit 1 SQL-Abfrage auf meiner Seite angezeigt werden:

  • Kategorie 1:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub Kat. Nr.
  • Kategorie 2:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub cat n
  • Kategorie 3:
    • Sub cat 1
    • Sub cat 2
    • ...
    • Sub cat n
  • ...

Tabellenschema:

  • Kategorien
    • id | Katzenname |
    • Beschreibung
  • Subkategorie
    • id | parent_id | Katzenname | Beschreibung

Derzeit eine Abfrage für die Kategorien und in der PHP-while-Schleife eine weitere Abfrage für Unterkategorien ich verwende, aber das gibt mir eine Menge Anfragen auf einer Seite

Antwort

1

Sie sollten alle Kategorien und alle Unterkategorien erhalten. So etwas wie das:

$sql = ' 
    SELECT * FROM categories ORDER BY id ASC 
'; 
$result = mysql_query($sql); 

$categories = array(); 

while ($row = mysql_fetch_array($result)) { 
    $categories[$row['id']] = $row; 
} 

// get the subcategories 
$sql = ' 
    SELECT * FROM subcategories ORDER BY id ASC 
'; 
$result = mysql_query($sql); 

while ($row = mysql_fetch_array($result)) { 
    $categories[$row['parent_id']]['subcategories'][] = $row; 
} 

print_r($categories); 

Dies würde sie in eine schöne Array-Struktur, die Sie tun können, was immer Sie in PHP wollen. Und es sind nur zwei Abfragen.

+0

danke Bisco, löste es auf Ihre Weise – Bundy

0

Wir bräuchten Um zu sehen, dass Ihr Tabellenschema eine korrekte Kritik bietet, können Sie jedoch die Unterkategorien den Kategorien in einer Abfrage nach Kategorien und Unterkategorien zuordnen. Wann immer Sie eine neue Kategorie sehen, wissen Sie, dass es an der Zeit ist, die aktuelle Unterkategorienliste zu beenden und eine neue Kategorie zu beginnen.

0

Ohne die Tabellen zu sehen, müssen Sie wahrscheinlich so etwas wie:

SELECT category.name, subcategory.name 
FROM categories 
LEFT JOIN subcategory 
    ON subcategory.category_id = category.id 
ORDER BY category.name, subcategory.name 
+0

das gibt mir nur die erste Unterkategorie von jeder Kategorie. Wie würden Sie das in PHP machen? – Bundy

+0

Es ist generell keine gute Idee, nach String-Werten zu sortieren. – bisko

+0

@bisko: Ich stimme absolut zu. Angesichts der Frage dachte ich, es wäre besser, die kürzeste, aber immer noch brauchbare Antwort zu geben, anstatt die erforderlichen Änderungen vorzunehmen ... – Zed

1

ist es nie eine Notwendigkeit für zwei Tabellen für Baumstrukturen, ein Standard-Baum-ing Tabellenschema sein könnte:

categories 
id | catname | description | parent | lineage 

Lineage würde den Pfad zurück zur Root-Kategorie enthalten, z‚0,2,5,6‘ Eltern würden 6

Dann für Ihre Frage enthalten können Sie alle aus der Tabelle ORDER BY LÄNGE (Linie) ASC SELECT

, nachdem Sie Ihre Suchresultates aus dem db Sie indizieren sie haben durch ihre ID

$categories = array(); 
while($row = mysql_fetch_assoc($result)){ 
    $categories[$row['id']] = $row; 
} 

jetzt, wenn Sie eine Schleife durch sie in Ihrem html können Sie überprüfen, ob die aktuelle Kategorie alle untergeordneten Kategorien.

Lineage wird verwendet, um alle Kategorien zu finden, die Nachkommen einer bestimmten Kategorie sind:

SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]' 

Diese alle Kategorien mit 5 in der Linie erhalten werden.

+0

Das ist etwas, aber die Struktur ist bereits festgelegt, daher ist das Ändern der DB-Struktur in diesem Moment ein Nein – Bundy

+0

verdammt, schwingen und ein Fräulein –

0

ähnlich wie Zed Antwort, sondern aus der Tabelle Unterkategorie auswählen und dann Verbindungskategorien:

SELECT categories.name, subcategory.name 
FROM subcategory 
JOIN categories 
    ON category.id = subcategory.category_id 
ORDER BY category.id, subcategory.id 

Dadurch kehren Wertepaar wie (Kategorie 1, Unter cat 1), (Kategorie 1, Unter cat 2) ... Für weitere Spalten, um sie auf die Erklärung hinzufügen und Aliase, wenn angemessen wie

SELECT categories.name AS maincat_name, 
    subcategory.name AS subcat_name, subcategory.id AS subcat_id 
1
<? include('qry/viewJobs_qry.php'); ?> 
<table width="900" class="tableFontSize"> 
    <TR> 
     <TD> 

      </a>Category 
     </TD> 
    </TR> 
    </table> 
    <?php 
    if(!empty($viewJobs)) { 

    while($dataJobs=mysql_fetch_array($viewJobs)) { 

    $category = $dataJobs[jobNumber]; 

    ?> 
    <script language="javascript"> 
    function toggle<? echo $category; ?>() { 
    var category = "<? echo $category; ?>"; 
    var ele = document.getElementById(category); 
    var text = document.getElementById("displayText"); 
if(ele.style.display == "block") { 
     ele.style.display = "none"; 

} 
else { 
    ele.style.display = "block"; 

} 
    } 
     </script> 
    <table width="900" class="tableFontSize"> 
    <TR> 
     <TD> 

      <a id="displayText" href=javascript:toggle<? echo $category; ?>();>+ </a><? echo $category; ?> 
     </TD> 
    </TR> 
    <TR> 
     <TD> 
      <span id="<? echo $jobNumber; ?>" style="display: none;"><div id="width900"><? include('subCategoryArray.php'); ?> </div></span> 
     </TD> 
    </TR> 
      </table> 

      <? }} ?> 

      </table> 
Verwandte Themen