Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consultas Avanzadas MySQL

Estas en el tema de Consultas Avanzadas MySQL en el foro de Bases de Datos General en Foros del Web. Estimados amigos. Tengo una tabla MySQL llamada registro, que tiene un campo llamado id_libro. Este campo numérico guarda el dato del id de un libro, ...
  #1 (permalink)  
Antiguo 03/01/2004, 20:41
 
Fecha de Ingreso: enero-2004
Mensajes: 3
Antigüedad: 20 años, 3 meses
Puntos: 0
Exclamación Consultas Avanzadas MySQL

Estimados amigos.

Tengo una tabla MySQL llamada registro, que tiene un campo llamado id_libro. Este campo numérico guarda el dato del id de un libro, que está en otra tabla llamada libros. A su vez, la tabla llamada libros tiene un campo que se llama titulo.
Lo que deseo es ordenar los datos de la tabla registro, por el título del libro que está en la tabla libros, relacionando los id_libro. El problema es que los datos de la tabla libros están desordenados. Por otra parte, necesito acceder a estos datos vía PHP. ¿Podrán ayudarme? Muchas gracias !!
  #2 (permalink)  
Antiguo 04/01/2004, 19:40
Avatar de gustavoang  
Fecha de Ingreso: julio-2003
Ubicación: Valencia - Venezuela
Mensajes: 253
Antigüedad: 20 años, 9 meses
Puntos: 1
Código PHP:
<?php
# Lo de abajo es la cadena sql:
$SQL="SELECT id,titulo FROM libros ORDER BY titulo";

# Haces una conexión:
mysql_connect("localhost","tu_user","tu_password");

# Ejecutas la sentencia:
$ejecutar=mysql_db_query("tu_base_de_datos","$SQL");

echo 
'<table><tr><th>Id.</th><th>T&iacute;tulo</th></tr>';

# Creas un bucle para que traiga los registros:
while($traer=mysql_fetch_array($ejecutar)){
    echo 
'<tr><td>{$traer["id"]}</td><td>{traer["titulo"]}</td></tr>';
}
echo 
'</table>';
?>
No he probado ese código, pero debe funcionar.

Saludos.

Gustavo Narea.

Última edición por gustavoang; 04/01/2004 a las 19:45
  #3 (permalink)  
Antiguo 04/01/2004, 20:06
 
Fecha de Ingreso: enero-2004
Mensajes: 3
Antigüedad: 20 años, 3 meses
Puntos: 0
GRacias por tu respuesta pero fíjate que no es lo que yo pedía.

Tu respuesta es una consulta simple, con las que no tengo problemas. Incluso con algunas mucho más complejas que esta.

El problema es con una consulta avanzada que ordena los datos en función de los datos de otra tabla.

Sería de gran ayuda una respuesta a esto.

Muchas gracias !!!!
  #4 (permalink)  
Antiguo 05/01/2004, 02:09
Avatar de gustavoang  
Fecha de Ingreso: julio-2003
Ubicación: Valencia - Venezuela
Mensajes: 253
Antigüedad: 20 años, 9 meses
Puntos: 1
Déjame ver si entendí:

Tienes dos tablas:
  1. registro: con el campo id_libro
  2. libro: con los campos id_libro y titulo

Y quieres que se ordenen los registros según el título del libro que está en la tabla llamada "libro".
Código PHP:
<?php
# Lo de abajo es la cadena sql:
$SQL="SELECT id_libro,titulo FROM libros ORDER BY titulo";

# Haces una conexión:
mysql_connect("localhost","tu_user","tu_password");

# Ejecutas la sentencia:
$ejecutar1=mysql_db_query("tu_base_de_datos","$SQL");

echo(
'
   <table>
      <tr>
         <th>T&iacute;tulo</th>
         <th>id_libros en la tabla "libros"</th>
         <th>id_libros en la tabla "registro"</th>
      </tr>
   '
);

# Creas un bucle para que traiga los registros:
while($traer_desde_libros=mysql_fetch_array($ejecutar1)){

/* Esta sentencia es la que en sí va a ordenar los resultados
    como tú quieres:       */
   
$ejecutar2=mysql_db_query("tu_db","SELECT id_libro FROM registro WHERE id_libro='".$traer_desde_libros['id_libro']."'");

   
$traer_desde_registro=mysql_fetch_array($ejecutar2);

    echo(
'
       <tr>
          <td>'
.$traer_desde_libros["titulo"].'</td>
          <td>'
.traer_desde_libros["id_libro"].'</td>
          <td>'
.traer_desde_registro["id_libro"].'</td>
       </tr>'
);

   
mysql_free_result($ejecutar2);
}
mysql_free_result($ejecutar1);
echo 
'</table>';
?>
No he probado el código, pero debe funcionar.

Si no entiendes lo que hice, dímelo y lo explico, lo que ocurre es que en este momento no tengo mucho tiempo... pero cualquier cosa, me dices para responderte luego.

Saludos.

Gustavo Narea.

Última edición por gustavoang; 05/01/2004 a las 02:14
  #5 (permalink)  
Antiguo 05/01/2004, 03:16
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 8 meses
Puntos: 2
No tienes que ejecutar dos instrucciones select para obtener los datos ordenados como los que quieres:
Código:
select * from registro inner join libros on registro.idlibro=libros.idlibro
order by libros.titulo
Un saludo.
  #6 (permalink)  
Antiguo 05/01/2004, 08:05
 
Fecha de Ingreso: diciembre-2003
Mensajes: 53
Antigüedad: 20 años, 4 meses
Puntos: 0
Hmmm... Por lo que entendí de tu pregunta, me extrañó que dijeras consultas avanzadas...

>El problema es con una consulta avanzada que
>ordena los datos en función de los datos de otra tabla.

Bien:
SELECT * FROM registro,libro WHERE registro.id_libro = libro.id_libro ORDER BY libro.titulo

(Equivale a lo que te dió Vice)

Con esto, los datos de la tabla "Registros" se ordenan de acuerdo al título de la tabla "Libro"

Para el PHP, toma el código que te dió Gustavo

¿Es esto lo que necesitas?
---------------------------

Ahora, esto MUESTRA los datos como quieres, pero, tal vez te referías a FISICAMENTE MODIFICAR en la BD la tabla de registros para que queden ordenados...¿Te referías a esto..?
Si es así, pues no lo sé, pero no le veo razón de hacerlo.


Saludos

Giorgio
  #7 (permalink)  
Antiguo 05/01/2004, 12:21
Avatar de gustavoang  
Fecha de Ingreso: julio-2003
Ubicación: Valencia - Venezuela
Mensajes: 253
Antigüedad: 20 años, 9 meses
Puntos: 1
welias, ya que dices que quieres accerder a esos dator por medio de php, puedes usar el código mío (el último código, pero le quitar la segunda sentencia) con la sentencia que dió Giorgio.

Algo así:

Código PHP:
<?php
# Lo de abajo es la cadena sql que dió Giorgio:
$SQL="SELECT * FROM registro,libro WHERE registro.id_libro = libro.id_libro ORDER BY libro.titulo";

# Haces una conexión:
mysql_connect("localhost","tu_user","tu_password");

# Ejecutas la sentencia:
$ejecutar=mysql_db_query("tu_base_de_datos","$SQL");

echo(
'
   <table>
      <tr>
         <th>T&iacute;tulo</th>
         <th>id_libros en la tabla "libros"</th>
         <th>id_libros en la tabla "registro"</th>
      </tr>
   '
);

# Creas un bucle para que traiga los registros:
while($traer_desde_libros=mysql_fetch_array($ejecutar)){

    echo(
'
       <tr>
          <td>'
.$traer_desde_libros["titulo"].'</td>
          <td>'
.traer_desde_libros["id_libro"].'</td>
          <td>'
.traer_desde_libros["id_libro"].'</td>
       </tr>'
);
}
mysql_free_result($ejecutar);
echo 
'</table>';
?>
Eso es lo que te sugiero.

Saludos.

Gustavo Narea.

Última edición por gustavoang; 05/01/2004 a las 12:25
  #8 (permalink)  
Antiguo 06/01/2004, 06:23
 
Fecha de Ingreso: enero-2004
Mensajes: 3
Antigüedad: 20 años, 3 meses
Puntos: 0

Buenísimo !!! Anduvo perfecto !!! ¿Pero no es usar muchos recursos del servidor para hacer la búsqueda de esta manera? De todas formas anduvo rebien.

Lo que se me complicó es con la paginación. Yo paginaba usando LIMIT pero ahora es muy difícil porque tengo dos while anidados y entonces el límite es incierto para uno de los dos.

¿Podrás ayudarme con esto?

Gracias !!!!!!

  #9 (permalink)  
Antiguo 06/01/2004, 10:33
 
Fecha de Ingreso: diciembre-2003
Mensajes: 53
Antigüedad: 20 años, 4 meses
Puntos: 0
Hmm...

Yo no he usado la instrucción LIMIT.
Sabías que todo esto lo puedes hacer con DreamWeaver..? lo has checado..?

Te permite crear listados, Inserts, Updates, Deletes, Protección de páginas, Logins, Navegación de páginas(Siguiente, Previo Último, etc.)
Todo esto en minutos(usualmente)
Cuando ya DW no puede hacer algo que tu necesites pues entonces ya tomas el código

Saludos

Giorgio
__________________
EmpresasEnRed.com
Diseño Web
  #10 (permalink)  
Antiguo 06/01/2004, 12:37
Avatar de gustavoang  
Fecha de Ingreso: julio-2003
Ubicación: Valencia - Venezuela
Mensajes: 253
Antigüedad: 20 años, 9 meses
Puntos: 1
Dependiendo de la cantidad de registros que se devuelven, si pudiera consumir muchos recursos.

En cuanto a la paginación, creo que esto te puede servir:

Código PHP:
<?php
# La siguiente variable guarda el límite de registros mostrados, si quieres la modificas
$limite=20;

$paginado=(isset($_GET["menor_registro"]) AND isset($_GET["mayor_registro"])) ? true false;

# Creamos la sentencia sql, dependiendo de si se ha paginado
$sSQL=($paginado) ? "SELECT * FROM registro,libro WHERE registro.id_libro = libro.id_libro AND registro.id_libro BETWEEN ".$_GET["menor_registro"]." AND ".$_GET["mayor_registro"]." ORDER BY libro.titulo" "SELECT * FROM registro,libro WHERE registro.id_libro = libro.id_libro ORDER BY libro.titulo";

# Haces una conexión:
mysql_connect("localhost","tu_user","tu_password");

# Ejecutas la sentencia:
$ejecutar=mysql_db_query("tu_base_de_datos","$SQL");

if(
$paginado){
    echo 
'<p>Mostrando los registro <b>'.$_GET["menor_registro"].'</b> al <b>'.$_GET["mayor_registro"].'</b>.</p>';
}else{
    echo 
'<p>Mostrando los registros <b>1</b> al <b>'.$limite.'</b>.</p>';
}

echo(
'
   <table>
      <tr>
         <th>T&iacute;tulo</th>
         <th>id_libros en la tabla "libros"</th>
         <th>id_libros en la tabla "registro"</th>
      </tr>
   '
);

# Creas un bucle para que traiga los registros:
 
while($traer_desde_libros=mysql_fetch_array($ejecutar)){

    echo(
'
       <tr>
          <td>'
.$traer_desde_libros["titulo"].'</td>
          <td>'
.traer_desde_libros["id_libro"].'</td>
          <td>'
.traer_desde_libros["id_libro"].'</td>
       </tr>'
);
}
mysql_free_result($ejecutar);
echo 
'</table>';


     
$menor=++$_GET["registro_mayor"];
     
$mayor=$menor+$limite;
     echo (
'<p>Mostrar los <a href="'.$_SERVER["PHP_SELF"].'?registro_menor='.$menor.'&registro_mayor='.$mayor.'">pr&oacute;ximos '.$limite.' registros</a>.</p>');

?>
Supongo que esto es lo que necesitas.

No lo he probado, pero supongo que funciona.

Si no entiendes cualquier cosa del script, lo escribes.

Ahora que lo veo mejor, creo que ese script podría colocarlo en las faqs de PHP... cuáles son sus sugerencias?

Saludos a todos!

Gustavo Narea.

Última edición por gustavoang; 06/01/2004 a las 12:47
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:42.