2011-07-20 13 views
5

Tengo una consulta que obtiene todos los registros ordenados por last_name. Ahora me gustaría crear un bucle que grupos de estos resultados por la primera letra del apellido y mostrar la letra encima del grupo, es decirResultados PHP de grupo en la primera letra del nombre

A 
----------- 
Albert 
Alfred 

C 
----------- 
Charles 

D 
----------- 
Delta etc... 

Gracias!

Respuesta

9

Ordenar los resultados por lastname en MySQL lado y realizar un seguimiento del cambio de la primera letra de PHP lado:

<?php 

$rs = mysql_query("SELECT * FROM mytable ORDER BY lastname"); 

while ($rec = mysql_fetch_assoc($rs)) { 
    if ($initial !== strtoupper(substr($rec['lastname'], 0, 1)) { 
     $initial = strtoupper(substr($rec['lastname'], 0, 1)); 
     print "$initial\n"; 
    } 
    print $rec['lastname'] . "\n"; 
} 

?> 
+0

Este funcionó ... después de cambiar $ initial! == strtoupper (substr ($ rec ['lastname'], 1, 1) to $ initial! == strtoupper (substr ($ rec ['lastname'], 0, 1) –

0

en su consulta, trate de añadir algo como:

group by substr(last_name,1,1) 

es decir

select substr(last_name,1,1) as alpha, * 
from tableName 
group by substr(last_name,1,1) 
+0

Esto solo devolverá un único registro por cada letra inicial – Quassnoi

+0

Quassnoi tiene razón. Use 'ORDER BY LEFT (last_name, 1) ASC' en su lugar. Por cierto ... Mientras desee consultar todas las filas, no podrá recuperar esos resultados "bloqueados". Al final, tendrás que hacer el 'bloqueo' final en tu código. – Marco

4
$letter = null; 
foreach ($array as $word) { 
    if ($letter != $word[0]) { 
    $letter = $word[0]; 
    echo '<b>'.strtoupper($word[0]) . '</b><br/>'; 
    } 
    echo strtoupper($word) . '<br/>'; 
} 

y para recorrer línea de consulta complemento:

order by `your_field` asc 
+0

mismo problema y solución que en [grupo mysql de php concat] (http://stackoverflow.com/questions/6719061/mysql-group-by-php-concat/6719354#6719354) – knittl

2

En su opinión se podía luego recorra los registros y divídalos:

$current = ''; 
foreach ($rows as $r) { 
    if (!$current || strtolower($r['name'][0]) != $current) { 
     $current = strtolower($r['name'][0]); 
     echo strtoupper($current).'<br />---------------'; 
    } 
    echo $row['name'].'<br />'; 
} 
3

Allready intentó algo como esto?

$last = ''; 
foreach($data as $key=>$row){ 
    if(substr($row['last_name'],0,1)!=$last) echo '<br /><br />'.substr($row['last_name'],0,1).'<br />----------------<br />'; 
    $last = substr($row['last_name'],0,1); 
    echo $row['last_name']; 
} 
+0

¡Impresionante! Estoy escribiendo ¡demasiado lento!: D – Marco

0

Sí se puede achive esto utilizando MySql

En mi caso BRAND_NAME va a ser la lista el resultado esperado.

Ejemplo:

SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' group by alpha 
UNION 
SELECT id, upper(SUBSTR(brand_name, 1, 1)) AS alpha FROM products WHERE brand_name != '' order by brand_name COLLATE NOCASE 

Resultado:

A 
    A Card 
    A Cef 
    A Cef O 
    B 
    Bacticef Tab 
    Bacticin 
    Bactidrox 
    Bactidrox Kid 
    ........ 

esperan que ayude a alguien.

Cuestiones relacionadas