[ Foro de SQL (y MySQL) ]

Consultar nombres por iniciales

10-Feb-2013 21:08
Martin Gorgojo Lopez
8 Respuestas

Hola es la primera vez que me dirigo a este foro y no se si he planteado la pregunta correctamente. La cuestión es que tengo una tabla con diferentes nombres y quisiera aplicar el ejemplo de seleccionar por una determinada letra "select * from productos where nombre like 'S%';" y a mi lo que me gustaría saber es la forma de cargar en una misma pagina todas las iniciales y no tener que crear 28 paginas para otras tantas letras y la manera de crear el enlace pertinente en un listado de letras. Dandoos las gracias por adelantado quedo a la espera de vuestras noticias
22-Feb-2013 15:43
Nacho Cabanes (+31)

Perdona el restraso, se me había pasado esta pregunta sin contestar.

No entiendo bien la pregunta. Si quieres mostrar todas las iniciales, ya harías un LIKE 'S%', sino que mostrarías todas ordenadas por nombre:

 
SELECT * FROM productos ORDER BY nombre
 


De forma que primero tendrás las que empieces por A, luego las que empiecen por B y así sucesivamente.

Lo del "enlace en un listado de letras" no suena a problema de SQL, sino a cómo paginar los resultados en un sitio web, y entonces sería una duda relacionada con PHP, ASP o el lenguaje que utilizaras para obtener los datos que hay almacenados en tu base de datos.


23-Feb-2013 21:05
Martin Gorgojo Lopez

Hola En primer lugar gracias por el interés, segundo como bien dices quizás no me halla explicado yo bien.
Empezare diciendo que trabajo con php y Mysql y como decía anteriormente el ejemplo anterior me funciona bien seleccionando letra por letra paro equivaldría a tener que crear 28 paginas, una por cada letra, y yo lo que quiero es que seleccione la letra que seleccione me lo cargue todo en la misma pagina.
Salu2.....................


24-Feb-2013 01:08
Nacho Cabanes (+31)

Sin ver el código fuente no tengo bien claro a lo que te refieres, pero se me ocurren dos posibles formas de plantearlo:

- No creas 28 páginas, sino que el usuario escoge la letra (haciendo clic en uno de entre varios enlaces, o bien con una lista desplegable, por ejemplo), y entonces tu creas una única página con la orden de SQL que comentabas al principio, aplicándola a la letra que habrías recibido mediante GET o POST desde el formulario anterior:  

mostrarResultados.php?letra=s

- Creas una única página con las 28 letras, que tendría una pequeña separación entre cada letra y la siguiente, y un "destino" antes de cada nueva letra. Entonces, cuando el usuario escoja una letra, muestras toda la página pero desplazando el cursor a la zona en la que está la letra que ha escogido el usuario:

mostrarResultados.php#s


24-Feb-2013 20:49
Martin Gorgojo Lopez

Eso es lo que pretendo pero ¿cual podría ser el código completo?
De momento lo estoy intentando con el siguiente código que vi en otro foro pero todavía no he conseguido que funcione bien:

 
<?php 
$link = mysql_connect("localhost", " ", " "); 
mysql_select_db(" ", $link);
 
$letras = array( "A", "B", "C", "D" , "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
for($i = 0; $i < count($letras); $i++) {
  echo "<a href='listado.php?nombre=$i'>" . $letras[$i] . "</a> | " ;
}
 
$l = $_GET['nombre1'];
$result = mysql_query("SELECT nombre FROM nuke_libros_autores where nombre like '" . $letras[$nombre] . "%' ORDER BY nombre" , $link); 
if ($row = mysql_fetch_array($result)){ 
  echo" <br>";
  echo "<table border = '1'> \n"; 
  echo "<tr><td>Autores</td></tr> \n"; 
  do { 
    echo "<tr><td>" .$_GET['nombre'] ." </td></tr> \n"; 
  } while ($row = mysql_fetch_array($result)); 
  echo "</table> \n"; 
} 
else { 
  echo "¡ No se ha encontrado ningún registro !"; 
} 
?>
 


Con el he conseguido que en la tabla se vean tantos resultados como nombres tiene cada inicial pero en vez del nombre se ve el numero correspondiente a dicha inicial.


27-Feb-2013 11:08
Nacho Cabanes (+31)

Tienes alguna cosa rara por ahí...

Por una parte, pasas la variable nombre, pero luego lees "nombre1" y finalmente comparas con un valor del array en vez de con la variable que te han pasado... Yo simplificaría eso: no pasaría un número sino la letra escogida.

También está mal el "echo" que muestra los datos obtenidos.

En cuanto a la "lógica global", para que vaya "razonablemente bien", debería tener "dos modos de funcionamiento": primero se muestra la lista de iniciales, y, posteriormente, cuando se escoger una inicial, se muestran los detalles correspondientes a esa inicial (pero no antes).

Eso se podría conseguir poniendo un "if" al principio, que mire si ya se ha escogido inicial o no:

 
<?php 
if (!isset(S_GET['nombre'])
{
  $letras = array( "A", "B", "C", "D" , "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
  for($i = 0; $i < count($letras); $i++) {
    echo "<a href='listado.php?nombre='$letras[$i]'>" . $letras[$i] . "</a> | " ;
  }
}
 
else
 
{
  $link = mysql_connect("localhost", " ", " "); 
  mysql_select_db(" ", $link);
  $letra = $_GET['nombre'];
  $result = mysql_query("SELECT nombre FROM nuke_libros_autores where nombre like '" . $letra . "%' ORDER BY nombre" , $link); 
  if ($row = mysql_fetch_array($result)){ 
    echo" <br>";
    echo "<table border = '1'> \n"; 
    echo "<tr><td>Autores</td></tr> \n"; 
    do { 
      echo "<tr><td>" .$row["nombre"] ." </td></tr> \n"; 
    } while ($row = mysql_fetch_array($result)); 
  echo "</table> \n"; 
  } else { 
    echo "¡ No se ha encontrado ningún registro !"; 
  } 
}
?>
 


Queda algún problema menor, como el tratamiento de la "eñe". La lógica del "do-while" dentro del "if" no es especialmente legible , pero puede funcionar. Eso debe acercarse más a lo que tú buscas.


28-Feb-2013 12:59
Martin Gorgojo Lopez

Hola Nacho una vez mas gracias por tu interés y decirte que ya lo he solucionado. Te pongo el código utilizado por si algún otro usuario quiere hacer uso de él:

 
<?php 
if (!isset(S_GET['nombre'])
{
  $letras = array( "A", "B", "C", "D" , "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
  for($i = 0; $i < count($letras); $i++) {
    echo "<a href='listado.php?nombre='$letras[$i]'>" . $letras[$i] . "</a> | " ;
  }
}
 
else
 
{
  $link = mysql_connect("localhost", " ", " "); 
  mysql_select_db(" ", $link);
  $letra = $_GET['nombre'];
  $result = mysql_query("SELECT nombre FROM nuke_libros_autores where nombre like '" . $letra . "%' ORDER BY nombre" , $link); 
  if ($row = mysql_fetch_array($result)){ 
    echo" <br>";
 
echo $row[1];
}
?>
 


Básicamente así me funciona perfectamente en una pagina llamada listado.php. Después ya se puede adornar con mas cosas como una tabla o código html ademas de poner el coligo correspondiente a las letras en una pagina inicial que muestre tos los nombres. Y en cuanto a la eñe mas que nada es un adorno ya que no conozco ningún nombre de persona que empiece por esa letra.
Salu2................


03-Mar-2013 13:07
Nacho Cabanes (+31)

Tiene buena pinta.

Veo un fallo, que ya estaba en mi respuesta original: el primer "if", que comprueba si se han pasado datos, no debería ser:

if (!isset(S_GET['nombre'])

sino

if (!isset($_GET['nombre'])

(símbolo de dolar, en vez de una S, porque los parámetros GET se leen con el array asociativo $_GET).


03-Mar-2013 20:32
Martin Gorgojo Lopez

Tienes razón,no se como se ha podido colar la S pues yo en el original lo tengo correctamente.
Salu2.....................






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)