2011-07-05 20 views
7

Uno de mis comportamientos estándar para la paginación dentro de mis CMS es mostrar una barra rápida alfabética al ordenar por una columna alfa. Por ejemplo, si los resultados están ordenados por Apellido, debajo de la paginación imprimo una serie de enlaces, de la A a la Z, para llevarlo directamente a la página de un primer personaje en particular.¿Existe alguna forma mejor de crear un índice de paginación alfabética en PHP/MySQL?

Ejemplo:

Actualmente estoy haciendo esto por conseguir todos los resultados de esa columna, ordenados alfabéticamente, y luego bucle a través de todos ellos en PHP y grabar lo que la página aparece en el registro. Esto funciona bien cuando solo se trata de unos pocos cientos de resultados, pero ahora estoy trabajando en un proyecto que podría tener varios cientos de miles de filas y simplemente no es una opción viable.

¿Hay un método más eficiente para producir este tipo de índice? Tenga en cuenta que también necesita manejar algo más que A-Z, ya que las filas pueden comenzar con números o signos de puntuación.

Editar para aclarar: No estoy buscando una lista simple de todos los primeros caracteres, eso es fácil. Necesito calcular en qué página del total de resultados estaría el campo que comienza con ese carácter. Entonces, digamos que estamos buscando a alguien llamado Walter, y tengo 1000 filas, necesito saber en qué punto de ese rango de 1-1000 comienzan los W.

Respuesta

8

supongo que es un campo varchar , por lo que ¿ha considerado lo siguiente:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) FROM mytable; 

Esto le dará una lista distinta de las primeras letras del apellido.

También puede utilizar SUPERIOR() para asegurar que acaba de obtener caracteres en mayúsculas. LEFT() también logrará algo similar, por lo que debe experimentar para ver cuál se comporta más rápido en su conjunto de datos.

Editar: Si también desea recuentos:

SELECT DISTINCT SUBSTRING(lastname FROM 1 FOR 1) AS firstletter, COUNT(*) AS counter FROM mytable GROUP BY firstletter; 

No hay necesidad de hacer una segunda consulta para cada letra.

+0

Pregunta actualizada a más clara. Necesito más que solo una lista de todos los primeros personajes. – ChiperSoft

+0

Post-edit: Hmm, cuenta, eso podría funcionar. Usa el conteo de cada personaje para encontrar la página en la que estaría. – ChiperSoft

+0

Esto funciona perfectamente. Recorrer los resultados y resumir el total de todas las entradas antes me da exactamente el resultado que estaba buscando. ¡Gracias! – ChiperSoft

0

Al igual que en la paginación standrd es sólo una cuestión de ir a buscar y ordenar - sólo tiene que añadir donde con un% (no se olvide de creación de índice en esta columna)

0
<?php 
$result1 = mysql_query("SELECT LEFT(name, 1) AS fl FROM comics GROUP BY fl"); 
while ($row = mysql_fetch_array($result1)) 
{ 
$result11 = mysql_query("SELECT * FROM comics WHERE name LIKE '".$row['fl']."%'"); 
$countresult11 = mysql_num_rows($result11); 
?> 
<a href="?sort=<?php echo $row['fl']; ?>" title="<?php echo $countresult11; ?> Comics"><?php echo $row['fl']; ?></a>&nbsp;  
<?php } ?> 

podría ser un poco lo que está buscando, si usted reemplaza mis variables/nombres de tabla con los suyos.

que comprobará la mesa, tirar de la primera letra de cada grupo, mediante este escrito y de salida como

1 3 7 9 A B R W X Y Z 

dependiendo de lo que tienes en la mesa

+0

Gracias, pero eso no es exactamente lo que estoy buscando. He actualizado la pregunta para ser más claro. – ChiperSoft

1
$sql = "SELECT left(name, 1) AS firstchar FROM mytable ORDER BY name"; 

$result = mysql_query($sql) or die(mysql_error()); 

$letters = array(); 
$row = 0; 
while($row = mysql_fetch_assoc($result)) { 
    $row++; 
    if (!isset($letters[$row['firstchar']])) { 
     $letters[$row['firstchar']] = $row; 
    } 
} 

Esto le daría una serie introducido por las primeras letras, y el número de fila que aparecieron por primera vez en el valor:

a => 1, 
b => 50, 
c => 51, 

etc ...

Probablemente haya alguna manera de hacerlo puramente en SQL, pero MySQL no tiene incorporado ningún soporte de 'número de fila', por lo que sería una consulta muy desagradable.

+0

Esta es la forma en que lo estaba haciendo antes, pero esto se desmorona cuando la consulta devuelve varios cientos de miles de resultados. Eso es simplemente demasiado procesamiento para cada solicitud de página. – ChiperSoft

Cuestiones relacionadas