Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Armar grupo familiar

Estas en el tema de Armar grupo familiar en el foro de Mysql en Foros del Web. hola a todos tengo las siguiente tablas, en donde represento y armo un grupo familiar, esto me permite guardar que la persona xxx es familiar ...
  #1 (permalink)  
Antiguo 15/01/2014, 13:27
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 11 años, 11 meses
Puntos: 0
Armar grupo familiar

hola a todos tengo las siguiente tablas, en donde represento y armo un grupo familiar, esto me permite guardar que la persona xxx es familiar de la persona YYY

personas
id_persona
nombre
apellido

familias
id_familia //id propio de la tabla
id_flia //fk de la tabla personas
id_persona //fk de la tabla personas

la consulta que vengo haciendo es la siguiente

Código SQL:
Ver original
  1. SELECT id_familia, f.id_persona,id_flia, nombre,apellido FROM CS_familias f JOIN CS_personas p ON p.id_persona=f.id_flia  && f.id_persona=$id;

el $id es el id de la persona que muestro, en el ejemplo el $id es 21, en el cual me dice que la persona con el id 7 (id_flia) es pariente con la persona 21, esto lo muestro en el perfil de la persona 21

+------------+------------+---------+----------------+----------+
| id_familia | id_persona | id_flia | nombre | apellido |
+------------+------------+---------+----------------+----------+
| 4 | 21 | 7 | usuario 7 | u7 |
+------------+------------+---------+----------------+----------+

hasta aqui me funciona como necesito. en donde se me complica cuando accedo al perfil de la persona con el id 7, necesitaria que me aparesca que pariente de la persona 21.

he probado con la siguiente consulta, pero no da resultado ya que me da como resultado todos los registros que tengo.

Código SQL:
Ver original
  1. SELECT id_familia, f.id_persona,id_flia, nombre,apellido FROM CS_familias f JOIN CS_personas p ON p.id_persona=f.id_flia  && f.id_persona=7 || id_flia=7;

+------------+------------+---------+----------------+----------+
| id_familia | id_persona | id_flia | nombre | apellido |
+------------+------------+---------+----------------+----------+
| 4 | 21 | 7 | usuario 7 | u7 |
| 4 | 21 | 7 | usuario 21 | u21 |
| 4 | 21 | 7 | usuario 29 | u29 |
+------------+------------+---------+----------------+----------+

Última edición por leo_garay91; 15/01/2014 a las 13:34
  #2 (permalink)  
Antiguo 15/01/2014, 13:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: armar grupo familiar

Es un caso de ejercicio, y se resuelve habitualmente con dos tablas como mínimo, o tres, según el caso.
usuario(id)
pariente(usuario_id, usuario_id_pariente)
Cada relacion aparece en la segunda tabla dos veces: Cuando A es pariente de B y cuando B es pariente de A.
Una tercera tabla definiría la relación (padre, hijo, tio, tía, sobrino, primo, etc.)
La segunda tabla no requiere ID propia, sino que está determinada por el par (usuario_id, usuario_id_pariente), y numerar las "familias" es irreal, porque primero deberías definir a qué le llamas "familia", es decir, cuales son los límites del grupo compuesto por la familia (es un tema abstracto casi).
En cualquier caso, para describirlos detalles del pariente debes forzosamente llamar dos veces a la tabla de usuarios, con sus respectivos alias.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/01/2014, 18:25
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: armar grupo familiar

hola gnzsoloyo, gracias por contestar-...

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es un caso de ejercicio, y se resuelve habitualmente con dos tablas como mínimo, o tres, según el caso.
usuario(id)
pariente(usuario_id, usuario_id_pariente)
desde un principio lo habia planteado asi,como lo muestra la imagen de abajo

pero la persona que quiere el sistema no quiere eso...
Cita:
Iniciado por gnzsoloyo Ver Mensaje
Cada relacion aparece en la segunda tabla dos veces: Cuando A es pariente de B y cuando B es pariente de A.
Una tercera tabla definiría la relación (padre, hijo, tio, tía, sobrino, primo, etc.)
.
solo necesita saber si es pariente.. no importa y no quiere que se especifique.... si es padre, madre, hijo, etc
  #4 (permalink)  
Antiguo 15/01/2014, 18:38
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Armar grupo familiar

recien probando, me salio lo que necesito, pero necesito hacer 2 consultas por separado.
la primera es la que tenia anteriorment

Código MySQL:
Ver original
  1. SELECT id_familia, f.id_persona,id_flia,fecha, nombre,apellido FROM CS_familias f
  2.                                 join CS_personas p ON [B]p.id_persona=f.id_flia[/B]
  3.                                 && f.id_persona=$id

y la segunda

Código MySQL:
Ver original
  1. SELECT id_familia, f.id_persona,id_flia,fecha, nombre,apellido FROM CS_familias f
  2.                                 join CS_personas p ON [B]p.id_persona=f.id_persona[/B]
  3.                                
  4.                                 && id_flia=$id"

ambas consultas se diferencian en el join. y a cada una lo recorro con while diferente.
no es lo mas optimo.. pero no se cmo resolverlo
  #5 (permalink)  
Antiguo 15/01/2014, 19:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: armar grupo familiar

Cita:
Iniciado por leo_garay91 Ver Mensaje
solo necesita saber si es pariente.. no importa y no quiere que se especifique.... si es padre, madre, hijo, etc
¿Entendiste que una tabla relacional como la de parentesco, no requiere una PK propia?
Eso lo tienes mal.
Esa tabla tiene una PK definida por el par de FK, y si le pones una PK propia te arriesgas a que se repitan relaciones ya ingresadas. Porque estas serían válidas en tu modelo.

Por otro lado, no necesitas dos consultas para hacer lo que quieres... con una sola alcanza

¿No se entendió tampoco que debes invocar dos veces la misma tabla con diferentes alias?

Código MySQL:
Ver original
  1.     P1.id_persona,
  2.     P1.nombre,
  3.     P1.apellido
  4.     P2.id_persona IdPariente,
  5.     P2.nombre NombrePariente,
  6.     P2.apellido ApellidoPariente
  7. FROM CS_familias f
  8.     INNER JOIN CS_personas P1 ON p1.id_persona=f.id_persona
  9.     INNER JOIN CS_personas P2 ON p2.id_persona=f.id_parentesco
  10. WHERE f.id_persona=$id

Necesitas repasar un poco más el modelo E-R en lo relativo a relaciones de cardinalidad N:N, y al caso específico de relación de una entidad con sigo misma.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 15/01/2014, 23:00
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: armar grupo familiar

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Esa tabla tiene una PK definida por el par de FK, y si le pones una PK propia te arriesgas a que se repitan relaciones ya ingresadas. Porque estas serían válidas en tu modelo.
si, ahora comprendo.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿No se entendió tampoco que debes invocar dos veces la misma tabla con diferentes alias?
Cita:
Iniciado por gnzsoloyo Ver Mensaje
Necesitas repasar un poco más el modelo E-R en lo relativo a relaciones de cardinalidad N:N, y al caso específico de relación de una entidad con sigo misma.
eso no lo habia entendido bien, y en realidad no sabia como trabaja una relacion de una entidad consigo misma.

la unica modificacion que realice a la consulta fue en el where en donde le agregue || P2.id_persona= $id,
Código MySQL:
Ver original
  1.     P1.id_persona,
  2.     P1.nombre,
  3.     P1.apellido
  4.     P2.id_persona IdPariente,
  5.     P2.nombre NombrePariente,
  6.     P2.apellido ApellidoPariente
  7. FROM CS_familias f
  8.     INNER JOIN CS_personas P1 ON p1.id_persona=f.id_persona
  9.     INNER JOIN CS_personas P2 ON p2.id_persona=f.id_parentesco
  10. WHERE f.id_persona=$id || P2.id_persona= $id

porque por ejemplo:
Código MySQL:
Ver original
  1. SELECT P1.id_persona,P1.nombre,P1.apellido,P2.id_persona IdPariente,P2.nombre NombrePariente, P2.apellido ApellidoPariente,fecha,f.id_usuario,nombre_u,apellido_u FROM CS_familias f INNER JOIN CS_personas P1 ON P1.id_persona=f.id_persona INNER JOIN CS_personas P2 ON P2.id_persona=f.id_flia INNER JOIN CS_usuarios u ON u.id_usuario = f.id_usuario WHERE f.id_persona=21

me arroja esos resultados, pero cuando por al perfil de la persona 29 osea, en el WHERE f.id_persona=29, no me arrojaba nada
+------------+--------+----------+------------+----------------+------------------+
| id_persona | nombre | apellido | IdPariente | NombrePariente | ApellidoPariente |
+------------+--------+----------+------------+----------------+------------------+
| 21 | Elva | Aguer | 29 | Domingo | Garay |
| 21 | Elva | Aguer | 7 | Leonardo Ramon | Garay |
| 21 | Elva | Aguer | 30 | Glady | Garay |
+------------+--------+----------+------------+----------------+------------------+
Código MySQL:
Ver original
  1. SELECT P1.id_persona,P1.nombre,P1.apellido,P2.id_persona IdPariente,P2.nombre NombrePariente, P2.apellido ApellidoPariente FROM CS_familias f INNER JOIN CS_personas P1 ON P1.id_persona=f.id_persona INNER JOIN CS_personas P2 ON P2.id_persona=f.id_flia INNER JOIN CS_usuarios u ON u.id_usuario = f.id_usuario WHERE f.id_persona=29 ||P2.id_persona=29;
+------------+--------+----------+------------+----------------+------------------+
| id_persona | nombre | apellido | IdPariente | NombrePariente | ApellidoPariente |
+------------+--------+----------+------------+----------------+------------------+
| 21 | Elva | Aguer | 29 | Domingo | Garay |
+------------+--------+----------+------------+----------------+------------------+

bueno despues todo el quilombo que hice, entendi varias cosas, muchas gracias...

Etiquetas: armar, grupo, join, registro, select, tabla
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 14:22.