2010-06-04 6 views
6

Meine Datenbank hat das folgende SetupPHP & MYSQL: Gruppe mit von für die Kategorien

productid | productname | category id 

und ich möchte, dass sie wie so ausgeben:

category #1 
item 1 
item 2 
item 3 

category #2 
item 1 
item 2 
item 3 

Ich benutzte Gruppe durch die Gruppe sie zusammen und das funktioniert gut, aber ich möchte jede Gruppe durchlaufen und den Inhalt dieser Gruppe anzeigen. Wie würde ich das tun?

+0

Veröffentlichen Sie die Abfrage, die Sie verwenden, damit jemand PHP bereitstellen kann, um die Daten herauszuziehen. –

+0

Ich habe keine Abfrage, meine Frage ist welche Abfrage zu verwenden. Der Post enthält meine Datenbank-Setup (die enthaltenen Daten) und wie ich es anzeigen möchte, was sollte ich noch hinzufügen? – sam

Antwort

15

Ich würde nur eine einfache Abfrage zum Abrufen aller Zeilen, sortiert nach Kategorie-ID empfehlen. Geben Sie die Kategorie nur aus, wenn sich ihr Wert gegenüber der vorherigen Zeile ändert.

<?php 

$stmt = $pdo-> query("SELECT * FROM `myTable` ORDER BY categoryID"); 

$current_cat = null; 
while ($row = $stmt->fetch()) { 
    if ($row["categoryID"] != $current_cat) { 
    $current_cat = $row["categoryID"]; 
    echo "Category #{$current_cat}\n"; 
    } 
    echo $row["productName"] . "\n"; 
} 

?> 
2

Was Sie wollen, ist es, sie nach der Kategorie zu ordnen, nicht gruppieren sie.

Wenn Sie durch die Liste iterieren, geben Sie einfach eine neue Kopfzeile aus, wenn sich die category_id ändert.

0

Der einfachste Weg ist wahrscheinlich, die Liste der Kategorien zu ziehen, iterieren und ihre angeschlossenen Produkte ziehen. (Dh mehrere Abfragen.)

Zum Beispiel (Pseudo-Code):

$result = fetch_assoc("SELECT category_id FROM categories"); 
foreach($result as $row) 
{ 
    echo $row['category_id']; 
    $result2 = fetch_assoc("SELECT product_id FROM products"); 
    foreach($result2 as $row2) 
    { 
    echo $row2['product_id']; 
    } 
} 

Wenn Sie das alles in einer Abfrage tun, wollen Sie so etwas wie tun:

$result = fetch_assoc("SELECT product_id, category_id FROM products p JOIN categories c ON p.category_id = c.category_id ORDER BY c.category_id ASC"); 
$last = null; 
foreach($result as $row) 
{ 
    # Output the category whenever it changes 
    if($row['category_id'] != last) 
    { 
    echo $row['category_id']; 
    $last = $row['category_id']; 
    } 
    echo $row['item_id']; 
}

Dann können Sie iterieren über die Ergebnismenge und ziehen Sie den Kategorienamen heraus, wenn er sich ändert.

Es mag eine raffiniertere, elegantere Art geben, SQL zu schreiben, um alles zu tun, bevor Sie es aus der Datenbank bekommen, aber ich bin nicht so schlau. ;)

Hinweis: Beispiele verwenden Pseudocode. Ich benutze eine Abstraktion Klasse mysql, die wie funktioniert:

$db->query("SELECT stuff"); 
$db->multi_result(); // returns 2d-associative array

ich kann dann foreach($db->multi_result() as $row), die super faul und genial.

Ich kann den Code für die Abstraktionsschicht veröffentlichen, wenn Sie möchten.

7

sollte diese Arbeit:

$categories = array(); 
$result= mysql_query("SELECT category_id, product_name FROM `table` GROUP BY `catagory_id` ORDER BY `catagory_id`"); 
while($row = mysql_fetch_assoc($result)){ 
    $categories[$row['category_id']][] = $row['product_name']; 
} 

// any type of outout you like 
foreach($categories as $key => $category){ 
    echo $key.'<br/>'; 
    foreach($category as $item){ 
     echo $item.'<br/>'; 
    } 
} 

Der Ausgang Sie sich stylen können. Sie fügen einfach alles in ein mehrdimensionales Array mit der Kategorie-ID als Schlüssel der ersten Ebene ein.

EDIT: Das resultierende Array könnte wie folgt aussehen:

$categories = array(
    'cateogy_id_1' => array(
     1 => 'item_1', 
     2 => 'item_2', 
     ... 
    ), 
    'cateogy_id_2' => array(
     1 => 'item_1', 
     2 => 'item_2', 
     ... 
    ), 
    .... 
); 
2

Dieser Ansatz muss nicht die Daten von category_id sortiert werden.

Sie können php verwenden, um jede Kategorie in einem verschachtelten Array zusammenzufassen. Danach können die Daten einfach in einer Tabelle angezeigt, an eine Grap/Chart-Bibliothek übergeben werden usw.

<?php 
$stmt = $pdo-> query("SELECT * FROM myTable ORDER BY categoryID"); 


$categories = []; //the array to hold the restructured data 

//here we group the rows from different categories together 
while ($row = $stmt->fetch()) 
{ 
    //i'm sure most of you will see that these two lines can be performed in one step 
    $cat = $row["categoryID"]; //category id of current row 
    $categories[$cat][] = $row; //push row into correct array 
} 

//and here we output the result 
foreach($categories as $current_cat => $catgory_rows) 
{ 
    echo "Category #{$current_cat}\n"; 

    foreach($catgory_rows as $row) 
    { 
     echo $row["productName"] . "\n"; 
    } 
} 
?>