2010-06-04 27 views
6

Mi base de datos tiene la siguiente configuraciónPHP y MySQL: utilizando GROUP BY para las categorías

productid | productname | category id 

y quiero salida de ellos, de este modo:

category #1 
item 1 
item 2 
item 3 

category #2 
item 1 
item 2 
item 3 

utilicé grupo por el grupo juntos y eso funciona bien, pero quiero recorrer cada grupo y mostrar los contenidos de ese grupo. ¿Cómo haría esto?

+0

Publique la consulta que está utilizando para que alguien pueda proporcionar el PHP para extraer los datos. –

+0

No tengo ninguna consulta, mi pregunta es qué consulta usar. La publicación incluye la configuración de mi base de datos (los datos contenidos) y cómo quiero que se muestre, ¿qué más debo incluir? – sam

Respuesta

15

Recomendaría solo una consulta simple para buscar todas las filas, ordenadas por id. De categoría. Imprima la categoría solo si su valor cambia de la fila anterior.

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

Lo que quiere es ordenarlos por la categoría, no agruparlos.

SELECT * FROM MyTable 
ORDER BY category_id, product_id 

Cuando itera por la lista, solo muestra un nuevo encabezado cada vez que cambia el category_id.

0

La manera más fácil es, probablemente, extraer la lista de categorías, recorrer y extraer sus productos adjuntos. (Ie varias consultas.)

Por ejemplo (pseudocódigo):

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

Si desea hacerlo todo en una sola consulta se puede hacer algo como:

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

Entonces se puede repetir sobre el conjunto de resultados y extraiga el nombre de la categoría cada vez que cambie.

Puede haber una manera más sofisticada y elegante de escribir el SQL para hacer todo antes de obtenerlo de la base de datos, pero no soy tan inteligente. ;)

Nota: Los ejemplos usan pseudocódigo. Yo uso una clase de abstracción mysql que funciona como:

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

que pueda entonces foreach($db->multi_result() as $row), lo que es muy perezoso y impresionante.

Si lo desea, puedo publicar el código de la capa de abstracción.

7

Esto debería funcionar:

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

La salida puede estilo de sí mismo. Simplemente agrega todo en una matriz multidimensional con la identificación de categoría como las teclas de primer nivel.

EDITAR: La matriz resultante podría tener este aspecto:

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

Este enfoque no necesita los datos que se van ordenadas según la category_id.

Puede usar php para agrupar cada categoría en una matriz anidada. Después de esto, los datos se pueden mostrar fácilmente en una tabla, pasar a una biblioteca de gráficos/grap, etc ...

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