Jue May 04, 2006 5:04 am
|
 |
preiddy
Perlero Nuevo

|
Registrado: 29 Mar 2006
Mensajes: 50
|
|
| MySQL: Select de múltiples tablas |
|
|
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];
}
} |
|
|
|
|

Jue May 04, 2006 7:22 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|

Jue May 04, 2006 7:45 am
|
 |
preiddy
Perlero Nuevo

|
Registrado: 29 Mar 2006
Mensajes: 50
|
|
|
|
|
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. |
|

Jue May 04, 2006 8:49 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Jue May 04, 2006 9:29 am
|
 |
preiddy
Perlero Nuevo

|
Registrado: 29 Mar 2006
Mensajes: 50
|
|
|
|
|
Saludos y Muchas gracias.
----
PD: ¿era una consulta de perl o de DB?, jajaja
 |
|

Jue May 04, 2006 9:37 am
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
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, |
|

Jue May 04, 2006 9:46 am
|
 |
preiddy
Perlero Nuevo

|
Registrado: 29 Mar 2006
Mensajes: 50
|
|
|
|
|
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. |
|
Vie May 05, 2006 10:42 pm
|
 |
g013m
Perlero Nuevo

|
Registrado: 15 Jul 2005
Mensajes: 15
|
|
|
|
Powered by phpBB © 2001, 2005 phpBB Group
|