• Publicidad

MySQL: Select de múltiples tablas

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

MySQL: Select de múltiples tablas

Notapor preiddy » 2006-05-04 06:04 @294

Hola a todos, de nuevo.

Una duda de novato (y creo que de muy novato, ¡ja,ja,ja!), tengo una base de datos en MySQL, esta tiene tres tablas, relacionadas con un id único.

Ahora quiero consultar la tabla1, y por cada elemento de ella que esté en tabla2 y tabla3 quiero que los muestre.

Creo una conexión a tabla1, 2 y 3. Con while() me recorro toda la tabla1 y con otros while() dentro del primer while() para recorrer las otras tablas. Pero no consigo lo esperado, lo que espero es una lista como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
autor1
      direccion1
      direccion2
      --
      Especialidad1;Especialidad2;Espe...N
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

He probado múltiples opciones y no doy con ello, si me pueden ayudar, de antemano, muchas gracias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( @aa = $autor->fetchrow_array() ) {
  2.     print $aa[0];
  3.     while ( @dir = $direccion->fetchrow_array() ) {
  4.         print $dir[1];
  5.     }
  6. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Publicidad

Notapor kidd » 2006-05-04 08:22 @390

Hola.

Humm, me parece que estás pasando por alto el poder de las consultas de MySQL, deberías de hacer una consulta para hacer lo que quieres. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT tabla1.autor AS autor, tabla2.direccion AS dir1, tabla3.direccion AS dir2 FROM tabla1,tabla2,tabla3 WHERE tabla1.id = tabla2.id AND tabla2.id = tabla3.id
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya después puedes hacer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( @aa = $autor->fetchrow_array() ) {
  2.     print "Autor: $aa[0]",       "\n";
  3.     print "Dirección1: $aa[1]", "\n";
  4.     print "Dirección2: $aa[2]", "\n";
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para más detalles acerca de este tipo de consultas, checa el siguiente artículo:
http://www.informit.com/articles/articl ... Num=5&rl=1


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor preiddy » 2006-05-04 08:45 @406

Gracias por la respuesta.

De hecho en ese tipo de consulta no tengo problemas. No es cosa de consultas, quizás me expliqué (como de costumbre mal).

Ese tipo de consulta me devuelve el autor tantas veces aparezca y ese no es problema. El problema radica (y por eso lo puse en foro de perl básico y no en el de BD) al momento en que quiero mostrar la información por pantalla. No quiero que salga
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Autor: 1
Direccion1: UFREEB
Autor: 6
Direccion1: HMAYOCLIN
Autor: 6
Direccion1: UWISCONS
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

sino que imprima
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Autor: 1
Direccion1: UFREEB
Autor: 6
Direccion1: HMAYOCLIN
Direccion1: UWISCONS
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sigo pegándome con el código a ver si lo consigo, ¡ja,ja,ja!

De nuevo, gracias.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Notapor kidd » 2006-05-04 09:49 @451

Hola.

Muy bien, entonces lo que puedes hacer es que primero cuando hagas la consulta te ordene todo por autor, entonces ya después puedes hacer algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $mem = '';
  2.  
  3. while ( @db = $autor->fetchrow_array() ) {
  4.  
  5.     if ( $mem ne $db[0] ) {
  6.         print $db[0], "\n";
  7.         $mem = $db[0];
  8.     }
  9.  
  10.     print $db[1], "\n";
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Entonces te imprime el autor solamente cuando sea diferente al anterior, así no te repite una y otra vez el mismo autor.


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor preiddy » 2006-05-04 10:29 @478

Saludos y muchas gracias.

P.D.: ¿Era una consulta de Perl o de DB? ¡ja,ja,ja!

:lol:
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Notapor Perl user » 2006-05-04 10:37 @484

Hum... Si entendí bien el problema supongo que se trata de generar ( en este caso una salida ) conjuntos con llaves únicas y múltiples valores, es decir, un autor y diversas direcciones.

Si las prestaciones no son tan importante para este problema, es decir, si no es una cantidad enorme de registros, una solución podría ser.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %data;
  2. while ( my @row = $sth->fetchrow_array ) {
  3.     my $name = shift @row;
  4.     push @{ $data{$name} }, @row;
  5. }
  6. ...;
  7. foreach my $key ( sort keys %data ){
  8.     print "Autor: $key\n";
  9.         print "Dirección: $_\n" foreach @{ $data{$key} };
  10.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esa manera puedes transportar los datos si los requieres después. Cabe señalar que esta solución no es recomendada si la cantidad de tuplas existentes son muchas ( igual hablamos de más de 100 000 posiblemente ) puesto que hay que generar una estructura que guarde tal información. Pero tampoco es TAN dramáticamente lenta.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor preiddy » 2006-05-04 10:46 @490

Perl user, Maestro Honorario.

La respuesta es muy buena, de hecho por ahí iban mis intentos de hacerlo.

Claro mi banco de datos tiene más de un millón de duplas, y sólo tengo 512 de RAM. La respuesta de Kidd es también muy buena.

Gracias y Saludos.
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Notapor g013m » 2006-05-05 23:42 @029

Hola, quizás podrias echarle un vistazo al módulo Class::DBI, es muy buena ayuda para manejar BD, prácticamente te olvidas de escribir código SQL ;)

Saludos
Resistirse es inútil, al final todos serán asimilados.
http://g013m.unplug.org.ve
g013m
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2005-07-15 23:11 @007


Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados