Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/05/2014, 05:51
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Consulta sql uniendo tablas

Bueno, veamos...
Vamos a evaluar el problema por etapas.

Para obtener los clientes que tienen al menos un formulario (pero puede que más), podría hacerse así:
Código MySQL:
Ver original
  1. SELECT c.id, f.id
  2. FROM clientes C INNER JOIN formularios F ON F.cliente_id = C.id;

Si quieres sólo aquellos casos de clientes y formularios que no posean el id_estado = 1, lo excluyes:
Código MySQL:
Ver original
  1. SELECT c.id, f.id
  2. FROM clientes C INNER JOIN formularios F ON F.cliente_id = C.id
  3. WHERE F.estado_id != 1;

Si quieres todos los clientes, tal que devuelva NULL donde no haya formularios relacionados, no se usa INNER JOIN:
Código MySQL:
Ver original
  1. SELECT c.id, f.id
  2. FROM clientes C LEFT JOIN formularios F ON F.cliente_id = C.id
  3. WHERE F.estado_id != 1 OR F.cliente_id  IS NULL;

Ahora bien, si quieres todos los clientes, pero sólo te aparezcan los formularios en aquellos casos en que el cliente no tenga ninguno en estado_id=1, la cosa se complica, porque lo que hay que resolver es excluir aquellos que tienen alguno en ese estado.
Eso hay más de una forma de lograrlo. Una de ellas está cerca de lo que planteaste, la otra ... es algo diferente.
Código MySQL:
Ver original
  1. SELECT c.*
  2. FROM clientes C INNER JOIN (SELECT * FROM formularios WHERE F.estado_id = 1) F ON F.cliente_id = C.id
  3. WHERE F.cliente_id  IS NULL;
Cita:
Asi, que mi idea fue hacer una subconsulta, pero quiero ver de optimizarla porque cuando la hago correr, tarda mucho y da error.
Eso es porque ese campo "cliente_id" de la tabla "formularios" necesita ser indexado. Obviamente no lo está.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)