Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

MySQL: Select de múltiples tablas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Mensaje Jue May 04, 2006 5:04 am
preiddy
Perlero Nuevo
Perlero Nuevo
Registrado: 29 Mar 2006
Mensajes: 50
MySQL: Select de múltiples tablas Responder citando

Hola a tod=s de nuevo.
Una duda de novato (y creo que de muy novato, jajaja), 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:
Cita:
autor1
direccion1
direccion2
--
Especialidad1;Especialidad2;Espe...N
He probado múltiples opciones y no doy con ello, si me pueden ayudar, de antemano muchas gracias.
Código:
while (@aa=$autor->fetchrow_array())
{
    print $aa[0];
    while (@dir=$direccion->fetchrow_array()) {
        print $dir[1];
    }
}
Mensaje Jue May 04, 2006 7:22 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

Umm, me parece que estás pasando por alto el poder de los querys de MySQL, deberías de hacer un query para hacer lo que quieres. Por ejemplo:

Código:

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


Y ya después puedes hacer:

Código:

while (@aa=$autor->fetchrow_array()) {
print "Autor: $aa[0]", "\n";
print "Dirección1: $aa[1]", "\n";
print "Dirección2: $aa[2]", "\n";
}


Para más detalles acerca de este tipo de queries, checa el siguiente artículo:
http://www.informit.com/articles/article.asp?p=30875&seqNum=5&rl=1


Saludos
Mensaje Jue May 04, 2006 7:45 am
preiddy
Perlero Nuevo
Perlero Nuevo
Registrado: 29 Mar 2006
Mensajes: 50
Responder citando

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 basico y no en el de BD) al momento en que quiero mostrar la información por pantalla, no quiero que salga

    Autor: 1
    Direccion1: UFREEB
    Autor: 6
    Direccion1: HMAYOCLIN
    Autor: 6
    Direccion1: UWISCONS

sino que imprima

    Autor: 1
    Direccion1: UFREEB
    Autor: 6
    Direccion1: HMAYOCLIN
    Direccion1: UWISCONS

Sigo pegándome con el código a ver si lo consigo, jajaja. De nuevo gracias.
Mensaje Jue May 04, 2006 8:49 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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í:

Código:

my $mem = '';

while (@db=$autor->fetchrow_array()) {

    if($mem ne $db[0]){
        print $db[0],"\n";
        $mem = $db[0];
    }

    print $db[1],"\n";
}



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


Saludos
Mensaje Jue May 04, 2006 9:29 am
preiddy
Perlero Nuevo
Perlero Nuevo
Registrado: 29 Mar 2006
Mensajes: 50
Responder citando

Saludos y Muchas gracias.
----
PD: ¿era una consulta de perl o de DB?, jajaja
Laughing
Mensaje Jue May 04, 2006 9:37 am
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

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

Si el performance no es tan importante para este problema, es decir, si no es una cantidad enorme de registros, una solución podría ser.

Código:

my %data;
while ( my @row = $sth->fetchrow_array ) {
    my $name = shift @row;
    push @{ $data{$name} }, @row;
}
...
foreach my $key ( sort keys %data ) {
    print "Autor: $key\n";
    print "Direccion: $_\n" foreach @{ $data{$key} };
}


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 mas de 100,000 posiblemente ) puesto que hay que generar una estructura que guarde tal información. Pero tampoco es TAN dramáticamente lenta.

Saludos,
Mensaje Jue May 04, 2006 9:46 am
preiddy
Perlero Nuevo
Perlero Nuevo
Registrado: 29 Mar 2006
Mensajes: 50
Responder citando

Perl user
Maestro Honorario
La respuesta es muy buena, de echo 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.
Mensaje Vie May 05, 2006 10:42 pm
g013m
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Jul 2005
Mensajes: 15
Responder citando

Hola, quizás podrias echarle un vistazo al módulo Class::DBI, es muy buena ayuda para manejar BD, practicamente te olvidas de escribir código SQL Wink
http://search.cpan.org/~tmtm/Class-DBI-v3.0.14/lib/Class/DBI.pm

Saludos
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group