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

Complicacion con un select

Estas en el tema de Complicacion con un select en el foro de Mysql en Foros del Web. Buenas a todos, tengo una consulta que me esta complicando bastante la existencia :P os comento: Tengo tres tablas: PRESENTACIONES - id - nombre - ...
  #1 (permalink)  
Antiguo 15/10/2009, 03:31
 
Fecha de Ingreso: octubre-2009
Mensajes: 1
Antigüedad: 14 años, 6 meses
Puntos: 0
Exclamación Complicacion con un select

Buenas a todos,

tengo una consulta que me esta complicando bastante la existencia :P os comento:

Tengo tres tablas:

PRESENTACIONES
- id
- nombre
- areas_ids

AREAS
- id
- nombre

TRABAJOS
- id
- nombre
- area_id

Bien imaginemos que tenemos los siguientes datos en las tablas

PRESENTACIONES
[1] [Presentacion Prueba] [1,2]

AREAS
[1] [AREA UNO]
[2] [AREA DOS]
[3] [AREA TRES]

TRABAJOS
[1] [TRABAJO UNO] [1]
[2] [TRABAJO DOS] [2]
[3] [TRABAJO TRES] [3]

Bien pues quiero hacer un select de los trabajos que esten asociados a las areas asociadas a la presentacion de prueba, es decir todos los trabajos asociados a las areas 1 y 2 en este caso.

la consulta que actualmente tengo es:
Código:
SELECT id, nombre FROM trabajos 
WHERE area_id IN (SELECT areas_ids FROM presentaciones WHERE id = 1);
Y esta consulta solo me devuelve:
[1] [TRABAJO UNO]

en vez de devolverme:
[1] [TRABAJO UNO]
[2] [TRABAJO DOS]

Pero sin embargo si hago la consulta directamente sin el segundo select:
Código:
SELECT id, nombre FROM trabajos WHERE area_id IN (1,2);
si que me devuelve
[1] [TRABAJO UNO]
[2] [TRABAJO DOS]

Supongo que sera por que el valor que devuelve el segundo select lo toma como un solo valor y no como una de valores separados por comas. Se que podria hacerlo en dos consultas desde el codigo y estaria solucionado, pero el problema es que lo necesito hacer todo en una sola consulta.

Podeis ayudarme u orientarme en como resolverlo?
  #2 (permalink)  
Antiguo 15/10/2009, 04:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Complicacion con un select

Si el error es el que supones, pero tienes otro de fondo.

Para normalizar la bbdd te falta una tabla...!!!

La relación entre PRESENTACIONES y AREAS és muchos a muchos, n a n, cada presentación se puede presentar n areas y cada area puede recibir n presentaciones... luego la estructura es la siguiente


PRESENTACIONES
- id
- nombre

SESIONES
- presentacion_id
- area_id
- fecha


AREAS
- id
- nombre

TRABAJOS
- id
- nombre
- area_id

La nueva tabla SESIONES recoge el id de la presentación y el id de area de manera que puedes representar la relación n a n. He puesto un campo Fecha puesto que creo que podria ser relvante y para demostrar que crear la nueva tabla además nos permite guardar una información que antes no podiamos guardar....


Si tienes esta estructura tu consulta se resuelve facil....

Código sql:
Ver original
  1. SELECT tr.id, tr.nombre
  2. FROM trabajos tr
  3.              LEFT JOIN SESIONES ses
  4.                       ON tr.area_id=ses.area_id
  5. WHERE ses.presentacion_id=1


PRESENTACIONES
[1] [Presentacion Prueba]

SESIONES
[1][1][2009-09-24]
[1][2][2009-09-25]


AREAS
[1] [AREA UNO]
[2] [AREA DOS]
[3] [AREA TRES]

TRABAJOS
[1] [TRABAJO UNO] [1]
[2] [TRABAJO DOS] [2]
[3] [TRABAJO TRES] [3]

trabajos tr LEFT JOIN SESIONES ses ON tr.area_id=ses.area_id
[1] [TRABAJO UNO] [1][1][1][2009-09-24]
[2] [TRABAJO DOS] [2][1][2][2009-09-25]
[3] [TRABAJO TRES] [3][null][null][null]


WHERE ses.presentacion_id=1

[1] [TRABAJO UNO] [1][1][1][2009-09-24]
[2] [TRABAJO DOS] [2][1][2][2009-09-25]


SELECT tr.id, tr.nombre

[1] [TRABAJO UNO]
[2] [TRABAJO DOS]

Si?

Quim
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 08:05.