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

Consulta multitabla

Estas en el tema de Consulta multitabla en el foro de Bases de Datos General en Foros del Web. Hola a todos! Soy bastante novato en el tema de las bases de datos, y me ha surgido el siguiente problema trabajando con MySQL. Tengo ...
  #1 (permalink)  
Antiguo 24/03/2008, 13:46
 
Fecha de Ingreso: marzo-2008
Mensajes: 2
Antigüedad: 16 años, 8 meses
Puntos: 0
Consulta multitabla

Hola a todos!

Soy bastante novato en el tema de las bases de datos, y me ha surgido el siguiente problema trabajando con MySQL.

Tengo una tabla (llamémosla "tabla1") en la cual uno de los campos puede contener un número de valores variable, es decir, que puede estar vacío o tener 2, 3, 4, etc., no puedo controlar el número máximo de valores que puede llegar a tener. Para solucionarlo, en vez de crear ese campo en la tabla, he creado dos tablas más para relacionar las 3 entre sí: una con los valores que ese campo de la tabla1 podría contener ("tabla2", con los campos "id_descriptor" y "descriptor"), y otra ("tabla3") que relaciona las ids de la tabla1 con el "id_descriptor" de la tabla2.

De esta manera, si por ejemplo un elemento de la tabla1 tiene un descriptor, en la tabla3 habría una fila con el id correspodiente a ese elemento de la tabla1 y el id del descriptor de la tabla2, si un elemento tiene 2 descriptores, en la tabla3 habría dos filas con la id del elemento, y en cada fila la id del descriptor que corresponda. Hasta aquí todo bien, lo tengo solucionado con la siguiente consulta:

SELECT t1.elemento, GROUP_CONCAT( t2.descriptor
SEPARATOR ", " ) AS descriptores
FROM tabla1 t1, tabla 2 t2, tabla3 t3
WHERE t1.id_elemento >0
AND t1.id_elemento = t3.id_elemento
AND t2.id_descriptor = t3.id_descriptor
GROUP BY t1.elemento

Esta consulta me devuelve el nombre del elemento con sus descriptores concatenados, que es lo que buscaba. El problema es que esta consulta solo me devuelve aquellos elementos cuya id tb está en la tabla3, es decir, aquellos elementos que tienen descriptores y yo necesito que me devuelva TODOS los elementos, incluso aquellos que no tienen descriptor, y que en la columna "descriptores" ponga "ninguno" (o algo parecido) para aquellos elementos que no tienen descriptor. Algo así:


Código PHP:
Elemento         Descriptores
--------         ----------------
algo             descriptor1descriptor2
algo             ninguno
algo             descriptor5
... 
Podría añadir un descriptor cuyo valor sea "Ninguno" en la tabla2, pero prefiero evitarlo porque en la tabla1 hay 600 registros, y me gustaría encontrar alguna manera de no tener que agregar tb 600 en la tabla3.... He probado con subqueries, con NOT IN, pero no hay manera. Como os digo, soy bastante novato.

Muchas gracias!!

Saludos!!
  #2 (permalink)  
Antiguo 25/03/2008, 02:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Re: Consulta multitabla

Código:
SELECT t1.elemento, 
        GROUP_CONCAT( t2.descriptor SEPARATOR ", " ) AS descriptores
   FROM tabla1 t1 LEFT JOIN 
                   (tabla3 t3 LEFT JOIN tabla2 t2 
                          ON t3.id_descriptor = t2.id_descriptor) 
                   ON t1.id_elemento = t3.id_elemento
   WHERE t1.id_elemento>0
   GROUP BY t1.elemento;
No tengo el mysql aqui, pero tu problema esta en como relacionas las tablas, si no especificas como se relacionan hace un INNER JOIN con lo que solo te mostrará registros donde los campos comunes sean iguales, con LEFT JOIN te mostrarà TODOS los registtros del lado izquierdo de la relación y aquellos del lado derecho donde el campo comun sea igual...

(no se porque haces "WHERE t1.id_elemento>0")

Quim
  #3 (permalink)  
Antiguo 25/03/2008, 02:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Re: Consulta multitabla

Perdón, como te he dicho no tengo mysql aqui por lo que no se si GROUP_CONCAT(...) tendrà problemas con los nulos.

Quim
  #4 (permalink)  
Antiguo 25/03/2008, 05:03
 
Fecha de Ingreso: marzo-2008
Mensajes: 2
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: Consulta multitabla

Cita:
Iniciado por quimfv Ver Mensaje
Código:
SELECT t1.elemento, 
        GROUP_CONCAT( t2.descriptor SEPARATOR ", " ) AS descriptores
   FROM tabla1 t1 LEFT JOIN 
                   (tabla3 t3 LEFT JOIN tabla2 t2 
                          ON t3.id_descriptor = t2.id_descriptor) 
                   ON t1.id_elemento = t3.id_elemento
   WHERE t1.id_elemento>0
   GROUP BY t1.elemento;
No tengo el mysql aqui, pero tu problema esta en como relacionas las tablas, si no especificas como se relacionan hace un INNER JOIN con lo que solo te mostrará registros donde los campos comunes sean iguales, con LEFT JOIN te mostrarà TODOS los registtros del lado izquierdo de la relación y aquellos del lado derecho donde el campo comun sea igual...

(no se porque haces "WHERE t1.id_elemento>0")

Quim
Funciona perfecto!!!

Es justo lo que necesitaba, eres un fiera

En prinicipio parece que no pasa nada raro con los NULL, me los devuelve bien. Intentaré que me los convierta a algún string por eso. Estuve probando también con LEFT JOIN, pero de momento no lo controlo mucho. Lo del WHERE t1.id_elemento>0, es verdad que no hace falta, pegué el código directamente de una prueba que estaba haciendo y no me dí cuenta de que estaba.

Moltes gràcies!!!!
  #5 (permalink)  
Antiguo 25/03/2008, 06:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Re: Consulta multitabla

De res.

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 14:27.