MySQL - Problema con query compleja

 
Vista:

Problema con query compleja

Publicado por xkrlozx (2 intervenciones) el 23/07/2008 10:12:06
Hola, tengo un problema que no se resolver pero que quiero creer que tiene varias soluciones. Tengo una bbdd con 3 tablas:

Grupo (id_grupo, nombre)
1, Programadores
2, Diseñadores
3, Gerencia

Trabajo (id_trabajo,trabajo)
101, Web jamoneros
102, Aplicación lanchas
103, Buscador php

Nexo (id_grupo*, id_trabajo*)
101, 1
101, 2
101, 3
102, 2
103, 1

Siendo primary keys todas las que son id_*.
Un trabajo pudieron hacerlo uno o varios grupos lo cual se reflejará en la tablar nexo.
Quiero saber en que trabajos solo ha participado un grupo, que yo elijo y sacar la lista de todos los id_trabajo como resultado.

Estoy trabajando sobre esto:

SELECT n.id_trabajo, trabajo FROM nexo n WHERE
n.id_trabajo IN
(SELECT n.id_trabajo FROM trabajo t,grupo g, nexo n
WHERE (t.id_trabajo=n.id_trabajo AND n.id_grupo=g.id_grupo) AND g.grupo
LIKE ‘Programadores')

AND 1=(SELECT count(n.id_grupo)=1 FROM nexo n WHERE
n.id_trabajo IN
(SELECT n.id_trabajo FROM trabajo t,grupo g, nexo n WHERE
(t.id_trabajo=n.id_trabajo AND n.id_grupo=g.id_grupo) AND g.grupo
LIKE ‘Programadores')
);

Pero el AND 1=(SELECT count(n.id_grupo)=1 FROM no vale para nada porque no solo necesito sacarle el numero de grupos que participan sino de que trabajo se trata y:
AND 1=(SELECT n.id_trabajo,count(n.id_grupo)=1 logicamente no deja.

Muchísimas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con query compleja

Publicado por Jose Ramon Castelo (12 intervenciones) el 23/07/2008 17:16:37
Hola,

Igual esto te puede dar una pista:

SELECT trabajo.id_trabajo, trabajo.trabajo, grupo.id_grupo, grupo.nombre
from nexo, trabajo, grupo
where nexo.id_trabajo in (select distinct(b.id_trabajo) from nexo b
group by b.id_trabajo
having count(b.id_trabajo)=1)
and grupo.id_trabajo=nexo.id_trabajo
and trabajo.id_grupo=nexo.id_grupo;

De esta forma me sale una lista de los grupos y los trabajos de todos aquellos trabajos en los que participa un solo grupo (es lo que hace la subconsulta).

Espero que sirva de ayuda.

Un saludo desde A Coruña (España)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con query compleja

Publicado por Carlos (2 intervenciones) el 24/07/2008 13:08:49
Muy buena idea Jose Ramón, gracias, me funciono perfectamente añadiendole un AND grupo like 'Programadores'.

Ahora el problema que me ha surgido es que la consulta a la que pertenece empieza a ser muy grande y se vuelve muy lenta de hecho es esta:

SELECT t.titulo, r.revista, r.editorial, t.year, t.tipo, t.id_trabajo, r.id_revista, r.web, r.issn
FROM trabajo t, autores a, escribir e, revistas r, publicar p2, grupo g, nexo n
WHERE t.id_trabajo IN

(SELECT t.id_trabajo FROM nexo n, trabajo t, grupo g WHERE (g.id_grupo=n.id_grupo and t.id_trabajo=n.id_trabajo) AND n.id_trabajo IN

(select distinct(n.id_trabajo) from nexo n group by n.id_trabajo having count(n.id_trabajo)=1) AND g.grupo LIKE 'Programadores' )

AND r.id_revista=p2.id_revista AND t.id_trabajo=p2.id_trabajo AND t.id_trabajo=e.id_trabajo AND e.id_autor=a.id_autor
GROUP by p2.id_trabajo, p2.id_revista ORDER by t.year, t.titulo;

Esta consulta es correcta y pertenece a un buscador en php pero el resultado no lo llega a mostrar porque tarda demasiado tiempo son 73 resultados.
¿Hay alguna manera de optimizarla? seguro que repito los joins o esta mal organizada y por eso tarda tanto ¿no?

Un saludo desde Madriz :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con query compleja

Publicado por ery (69 intervenciones) el 25/07/2008 01:56:06
Creo que el query es mas facil asi, no lo probe asi que puedes tener algun error

select trabajo.id_trabajo, trabajo from trabajo, grupo, nexo
where trabajo.id_trabajo = nexo.id_trabajo
and nexo.id_grupo = grupo.id_grupo
and grupo.id_grupo = (select id_grupo from nombre
where nombre like "%Programadores%" limit 0, 1)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar