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

[SOLUCIONADO] Consulta sql uniendo tablas

Estas en el tema de Consulta sql uniendo tablas en el foro de Mysql en Foros del Web. Buenas, a ver si me pueden ayudar. Tengo un 2 tablas. TABLA 1: Clientes campos: id, telefono TABLA 2: Formularios campos: id,estado, id_cliente Estas tablas ...
  #1 (permalink)  
Antiguo 29/05/2014, 12:15
 
Fecha de Ingreso: abril-2013
Mensajes: 61
Antigüedad: 11 años
Puntos: 4
Consulta sql uniendo tablas

Buenas, a ver si me pueden ayudar.

Tengo un 2 tablas.

TABLA 1: Clientes
campos: id, telefono

TABLA 2: Formularios
campos: id,estado, id_cliente

Estas tablas estan relacionadas mediante Clientes.id <=> Formulario.cliente_id

- Quisiera crear un listado de todos los clientes que tenga al menos un formulario relacionado, y que ninguno de sus formularios relacionados este en estado=1

Para llegar a eso, creo que tengo que unir las tablas con inner join. Pero no logro hacer lo que quiero.



Código MySQL:
Ver original
  1. SELECT `clientes`.`id`, `formularios`.`id` FROM `clientes` INNER JOIN `formularios` on `formularios`.`cliente_id` = `clientes`.`id` WHERE `formularios`.`cliente_id` = '150' AND `formularios`.`estado_id` <> '1'

Esto me funciona pero no es lo que quiero, ya que por ejemplo si el cliente.id 150
tiene 3 formularios relacionados,

1 estado = '1'
2 estado= '0'

Me devuelve 2 registros, cuando quiero que sea NULL, asi al quitar esta parte del WHERE, `formularios`.`cliente_id` = '150', obtendria el listado que quiero.

Agradezco desde ya, cualquier tipo de ayuda y/o sugerencia
  #2 (permalink)  
Antiguo 29/05/2014, 14:46
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Consulta sql uniendo tablas

Creo que asi lo podrias resolver:
Código SQL:
Ver original
  1. SELECT clientes.*
  2. FROM clientes JOIN formularios
  3. ON clientes.id = formularios.cliente_id
  4. AND formularios.estado <> 1
Eso en teoria te devuelve el listado de clientes con sus formularios en estado 1

Ojala sirva...
Saludos
  #3 (permalink)  
Antiguo 30/05/2014, 04:01
 
Fecha de Ingreso: abril-2013
Mensajes: 61
Antigüedad: 11 años
Puntos: 4
Respuesta: Consulta sql uniendo tablas

Gracias Luciano, pero lo que me dices me devuelve el mismo resultado.

Y pensando creo que lo que tengo que hacer es una "subconsulta" algo asi

Código MySQL:
Ver original
  1. SELECT DISTINCT `cliente_id` FROM `formularios` WHERE `cliente_id` NOT IN (SELECT DISTINCT `cliente_id` FROM `formularios` WHERE `estado_id` = '1')

Pero me gustaria optimizarla porque tengo muchos registros en la tabla, ya que si a esta consulta le pongo un LIMIT 10, la acaba pero sin el limite llego al tiempo maximo de ejecucion.
  #4 (permalink)  
Antiguo 30/05/2014, 04:27
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: Consulta sql uniendo tablas

Cita:
Esto me funciona pero no es lo que quiero, ya que por ejemplo si el cliente.id 150
tiene 3 formularios relacionados,

1 estado = '1'
2 estado= '0'

Me devuelve 2 registros, cuando quiero que sea NULL, asi al quitar esta parte del WHERE, `formularios`.`cliente_id` = '150', obtendria el listado que quiero.
No puede devolverte NULL con INNSER JOIN, porque ésta cláusula sólo devuelve relaciones existentes.
Para lograr que devuelva todos los clientes tengan o no formularios relacionados, se debe usar LEFT JOIN, no INNER JOIN.
De todos modos no queda claro cuál es el resultado esperado, en el caso de que el cliente tenga más de un formulario en estado = 0, y alguno en estado = 1.
¿Ese cliente debe figurar en el listado o no?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 30/05/2014, 05:25
 
Fecha de Ingreso: abril-2013
Mensajes: 61
Antigüedad: 11 años
Puntos: 4
Respuesta: Consulta sql uniendo tablas

Gracias por la ayuda, pero paso a explicarme mejor, porque encare mal mi problema

Tengo:
- 2 tablas -> Formularios y Clientes
- Estas tablas se relacion por un identificador, unico en la tabla Clientes.
- Tabla: Formulario: Campos: 'id', 'estado', 'cliente_id'
- Tabla: Clientes: Campos: 'id'
(tengo mas cosas, pero esto es lo que estara en mis condiciones)



Quiero:
- Crear un listado de los id de clientes, que tengan por lo menos 1 formulario asociado. Y NINGUNA de sus formulario tenga el formulario.estado = 1

Al principio, pense en JOIN y sus derivados, pero realmente no necesito nada de la tabla clientes, lo podria hacer todo de la tabla formularios.
Asi, que mi idea fue hacer una subconsulta, pero quiero ver de optimizarla porque cuando la hago correr, tarda mucho y da error.
La subconsulta que me funciona es esta, pero funciona si le aplico un LIMIT = 10

Código MySQL:
Ver original
  1. SELECT DISTINCT `cliente_id` FROM `formularios` WHERE `cliente_id` NOT IN (SELECT DISTINCT `cliente_id` FROM `formularios` WHERE `estado_id` = '1')
  #6 (permalink)  
Antiguo 30/05/2014, 05:51
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: 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)
  #7 (permalink)  
Antiguo 30/05/2014, 10:13
 
Fecha de Ingreso: abril-2013
Mensajes: 61
Antigüedad: 11 años
Puntos: 4
Respuesta: Consulta sql uniendo tablas

Efectivamente, el campo de la tabla formularios, no estaba indexado.
Ya con ese cambio, la consulta es rapida.

MUCHISIMAS GRACIAS !!!!

Etiquetas: campo, join, null, registro, select, sql, tabla, tablas
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 18:52.