Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

paginar resultados con una consulta inner join

Estas en el tema de paginar resultados con una consulta inner join en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Os pongo un poco en situación para que entendáis qué quiero hacer. Tengo una tabla personas, y una tabla personas_telefonos para almacenar los teléfonos ...
  #1 (permalink)  
Antiguo 15/12/2008, 13:33
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta paginar resultados con una consulta inner join

Hola,
Os pongo un poco en situación para que entendáis qué quiero hacer.
Tengo una tabla personas, y una tabla personas_telefonos para almacenar los teléfonos de cada persona.
En personas tengo: Id, Nombre, Apellidos.
y en personas_telefonos: IdPersona, numero, etiqueta.
IdPersona es una foreign key de ID de la tabla personas.

Bien. Ahora quiero hacer un objeto en PHP que contenga a cada persona de la tabla:

class CPersona
{
public $Nombre;
public $Apellidos;
public $Telefonos;


... bla, bla, bla....

}

y otro objeto teléfono:

class CTelefono
{
public $IdPersona;
public $Etiqueta;
public $Numeros;
}

En el campo $Telefonos de CPersona, quiero que se guarde un array de objetos CTelefono, con los teléfonos de esas personas... Esto es sencillo. Cojo con un select y un inner join, y empiezo a meter los valores en los objetos...
Pero ahora bien. Imaginaos que quiero una página PHP con un listado de personas para gestionarlas: editar o borrar persona... Y quiero que un método de mi clase CPersona (GetPersonas() por ejemplo), me devuelva un array de objetos CPersona que yo luego pintaré como quiera en mi página.
Por tanto, me gustaría que mi método GetPersonas pudiese estar paginado... Yo le paso como parámetros el número de registros y el número de página a visualizar, y el me devuelve los x objetos necesarios... Más que nada para no cargar mucho el sistema con 100000 registros si luego voy a mostrar 20.
El problema es:
¿Cómo paginar una lista de registros resultados de un inner join con limit y offset?
Imaginaos el siguiente resultado:
ID | Nombre | Apellidos | Etiqueta | Numero
1 | Juanjo | Montiel | Movil| 654322334
1 | Juanjo | Montiel | fijo | 912345678

... ... ...
Mi inner join me ha devuelto dos registros, lógicamente, para una sola persona, pues tiene dos teléfonos... Pero a la hora de paginar, yo querría que mysql lo tomase como uno, para poder aplicar el limit y el offset y así poder sacar paginaciones por registros únicos de la tabla persona, no con los registros duplicados que me saca el inner join.


Buf, vaya rollo que os he soltado. ¿Alguien se ha enterado de algo?
¿Alguna solución que se os ocurra?
Es que llevo ya días dándole vueltas. Había conseguido una solución, que era haciendo un inner join con un group by ID, y luego por cada registro, hacer otra consulta para sacar los teléfonos de cada persona, y meterlos en el array de objetos correspondientes... Eso funciona, pero estoy haciendo una consulta nueva por cada registro que estoy mostrando. Si en una página estoy mostrando 20 personas, he tenido que hacer una consulta para sacar esas 20 personas, y una consulta por cada persona para sacar los teléfonos... Y no creo yo que esto sea muy eficiente.

¿Ideas?
¡Sea cual sea les estaré muy agradecido! :)

¡Gracias de antemano!

Saludos,

Kastwey.
  #2 (permalink)  
Antiguo 15/12/2008, 14:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: paginar resultados con una consulta inner join

Tema trasladado a PHP Orientado a Objetos.

http://www.forosdelweb.com/f21/funci...-datos-413499/
  #3 (permalink)  
Antiguo 16/12/2008, 03:12
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: paginar resultados con una consulta inner join

Hola,
Acabo de encontrar una función de mysql que resuelve mi problema: group_concat. Con un inner join, concatena los valores múltiples de los registros que agrupes con group by.
Ejemplo:
select per.ID as ID, per.Nombre as nombre, group_concat(pert.telefono) as telefonos from personas per inner join persona_telefonos pert on per.ID = pert.IdPersona group by per.ID;

ID | Nombre | Telefonos
1 | Juanjo | 665432334m951233445,430466113

Y esto ya con un explode sacas los registros teléfonos para meterlos en un array.
Saludos,

Kastwey.
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 07:44.