2010-06-04 17 views
6

için tarafından grubunu kullanarak My veritabanı aşağıdaki setupPHP & MYSQL: kategorilerde

productid | productname | category id 

vardır ve bu yüzden böyle çıktı onları istiyorum:

category #1 
item 1 
item 2 
item 3 

category #2 
item 1 
item 2 
item 3 

ben birlikte grubun onları tarafından grubunu kullanılan ve Bu iyi çalışıyor, ancak her grupta döngü yapmak ve o grubun içeriğini görüntülemek istiyorum. Bunu nasıl yapardım?

+0

Kullanmakta olduğunuz sorguyu kullanarak, birilerinin verileri dışarı çekebilmesi için PHP'yi sağlayabilirsiniz. –

+0

Sorgunuz yok, sorum sorulacak sorgu. Gönderi, veritabanı kurulumumu (içerdiği veriler) ve nasıl görüntülenmesini istediğimi, başka neler eklemem gerektiğini içerir? – sam

cevap

15

Kategori satırına göre sıralanan tüm satırları almak için basit bir sorgu öneriyorum. Kategoriyi, değeri önceki satırdan değiştiğinde çıkar.

<?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

Ne istiyorsan onları kategoriye göre sıralamak, gruplamak değil.

SELECT * FROM MyTable 
ORDER BY category_id, product_id 

Listede boyunca yineleme

, sadece çıkış yeni bir başlık her category_id değişir.

0

En kolay yol, muhtemelen kategoriler listesini almak, yinelemek ve bağlı ürünleri çekmektir. (Yani birkaç sorgular.) Örneğin

(yalancı kod):

$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']; 
    } 
} 

Eğer böyle bir şey yapabileceği tek sorguda her şeyi isterseniz:

$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']; 
}

Sonra yineleme yapabilirsiniz sonuç kümesi üzerinde ve değiştiğinde kategori adını çıkar.

Veritabanından almadan önce SQL'i yazmak için daha karmaşık ve zarif bir yöntem olabilir, ancak bu kadar akıllı değilim. ;)

Not: Örnekler, sözde kodu kullanır. süper tembel ve müthiş

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

elimden sonra foreach($db->multi_result() as $row): Ben gibi çalışır mysql soyutlama sınıfını kullanın.

İsterseniz, soyutlama katmanının kodunu gönderebilirim.

7

Bu çalışması gerekir:

$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/>'; 
    } 
} 

çıkış kendini stil özelliklerini ayarlayabilirsiniz. Her şeyi, birinci seviye anahtarları olarak kategori kimliğine sahip çok boyutlu bir diziye eklersiniz.

DÜZENLEME: Oluşan dizi aşağıdaki gibi görünebilir:

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

Bu yaklaşım veri gerek yoktur category_id sıralanabilir için.

Her kategoriyi iç içe geçmiş bir dizide gruplandırmak için php kullanabilirsiniz. Bundan sonra, veriler kolayca bir tabloda gösterilebilir, not/grafik kitaplığına geçirilebilir, vb ...

<?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"; 
    } 
} 
?>