php mysql while-loop categorization

Categorizar un gran resultado de mysql con php while?



while-loop categorization (3)

El código utilizado en respuesta a la sugerencia de dar7yls es el que se muestra a continuación, y muestra solo un disco por categoría:

$discresult = ''SELECT t.topictype, t.id, t.subject, t.topicimage, c.user_id, c.disc_id FROM topics AS t LEFT JOIN collections AS c ON t.id=c.disc_id WHERE c.user_id=''.$user_id.'' ORDER BY t.topictype''; $userdiscs = $db->query($discresult); $category = ""; while ($cur_img = mysql_fetch_array($userdiscs)) { if ($cur_img[''topictype''] != $category ) { $category = $cur_img[''topictype'']; echo ''<h2>'', $category, ''</h2>''; if ($cur_img[''topicimage'']!="") { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"".$cur_img[''topicimage'']."/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } else { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"img/no-disc-art.jpg/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } } }

Estoy usando lo siguiente para tomar mi gran conjunto de resultados de un db mysql:

$discresult = ''SELECT t.id, t.subject, t.topicimage, t.topictype, c.user_id, c.disc_id FROM topics AS t LEFT JOIN collections AS c ON t.id=c.disc_id WHERE c.user_id=''.$user_id; $userdiscs = $db->query($discresult) or error(''Error.'', __FILE__, __LINE__, $db->error());

Esto devuelve una lista de todos los elementos que posee el usuario. Entonces, necesito categorizar estos elementos en función del valor de la columna "topictype", que estoy haciendo actualmente al usar:

<h2>Category 1</h2> <?php while ($cur_img = mysql_fetch_array($userdiscs)) { if ($cur_img[''topictype'']=="cat-1") { if ($cur_img[''topicimage'']!="") { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"".$cur_img[''topicimage'']."/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } else { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"img/no-disc-art.jpg/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } } } mysql_data_seek($userdiscs, 0); ?> <h2>Category 2</h2> <?php while ($cur_img = mysql_fetch_array($userdiscs)) { if ($cur_img[''topictype'']=="cat-2") { if ($cur_img[''topicimage'']!="") { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"".$cur_img[''topicimage'']."/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } else { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"img/no-disc-art.jpg/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } } } mysql_data_seek($userdiscs, 0); ?>

Esto funciona bien cuando enjuago y repito el código, pero a medida que el sitio crece, espero tener problemas a medida que aumenta el número de opciones de "tipo de tema" (se esperan alrededor de 30 categorías). No quiero tener que hacer consultas separadas para cada grupo categorizado de discos, ya que con el tiempo tengo 30 consultas que se ejecutan a medida que las categorías aumentan, por lo que espero escuchar algunas sugerencias o enfoques alternativos :)

Gracias


puede buscar esa única vez, agrupar por categorías y luego mostrar cada una:

$userdiscs = mysql_fetch_array($userdiscs); $categories = Array (); foreach ($userdiscs as $cur_img) { $category = $cur_img[''topictype'']; if (isset ($categories[$category])) $categories[$category] = Array(); $categories[$category][] = $cur_img; } foreach ($categories as $category => $imgs) { echo ''<h2>'', $category, ''</h2>''; foreach ($imgs as $cur_img) { if ($cur_img[''topicimage'']!="") { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"".$cur_img[''topicimage'']."/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } else { echo "<div><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/"><img src=/"img/no-disc-art.jpg/" style=/"width:60px; height: 60px/" /></a><br /><a href=/"viewtopic.php?id=".$cur_img[''id'']."/" title=/"".$cur_img[''subject'']."/">".$cur_img[''subject'']."</a></div>"; } } }

editar: si $cur_img[''topictype''] no coincide con el título de su categoría h2, puede tener un "hash-array" como este:

$categories_names = Array ( ''cat-1'' => ''Category 1'', ''cat-2'' => ''Category 2'', ''cat-3'' => ''Category 3'' )

y reemplace echo ''<h2>'', $category, ''</h2>''; con echo ''<h2>'', $categories_names[$category], ''</h2>'';


puede intentar agregar "ORDER BY t.topictype" y luego emitir el encabezado cuando la categoría cambie

$category = ""; while ($cur_img = mysql_fetch_array($userdiscs)) { if ($cur_img[''topictype''] != $category ) { $category = $cur_img[''topictype'']; echo ''<h2>'', $category, ''</h2>''; } .... rest of output here }