Página 1 de 1

MySQL: Select de múltiples tablas

NotaPublicado: 2006-05-04 06:04 @294
por preiddy
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.002 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2006-05-04 08:22 @390
por kidd
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

NotaPublicado: 2006-05-04 08:45 @406
por preiddy
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.

NotaPublicado: 2006-05-04 09:49 @451
por kidd
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

NotaPublicado: 2006-05-04 10:29 @478
por preiddy
Saludos y muchas gracias.

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

:lol:

NotaPublicado: 2006-05-04 10:37 @484
por Perl user
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,

NotaPublicado: 2006-05-04 10:46 @490
por preiddy
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.

NotaPublicado: 2006-05-05 23:42 @029
por g013m
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