Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/12/2008, 13:33
kastwey
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
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.