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

Restringir SELECT

Estas en el tema de Restringir SELECT en el foro de Mysql en Foros del Web. Hola muchachos, Tengo las dos siguientes tablas: clientes id_cliente nombre contactos id_contacto id_cliente contacto[EXCELENTE, BUENO, REGULAR, MALO] Si yo quiero traer todos los contactos de ...
  #1 (permalink)  
Antiguo 08/06/2011, 08:39
 
Fecha de Ingreso: abril-2006
Ubicación: Bogotá
Mensajes: 251
Antigüedad: 18 años, 6 meses
Puntos: 14
Restringir SELECT

Hola muchachos,

Tengo las dos siguientes tablas:

clientes
id_cliente nombre


contactos
id_contacto id_cliente contacto[EXCELENTE, BUENO, REGULAR, MALO]

Si yo quiero traer todos los contactos de los clientes puedo hacer un:

Código:
SELECT cliente.* FROM clientes cliente INNER JOIN contactos contacto ON contacto.id_cliente = cliente.id_cliente
El inconveniente es que no sé cómo hacer para que solo traiga los clientes que no han tenido contactos EXCELENTES ni BUENOS, un cliente puede tener muchos contactos, muchos REGULAR, MALO etc .. pero me interesa traer solo el nombre de aquellos que nunca han tenido un contacto EXCELENTE ni BUENO, sin importar cuantos REGULAR y MALO hayan tenido.

Espero que me puedan colaborar con esta gestión.
  #2 (permalink)  
Antiguo 08/06/2011, 09:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Restringir SELECT

Código MySQL:
Ver original
  1.     clientes CL
  2.     INNER JOIN
  3.     contactos C ON C.id_cliente = CL.id_cliente
  4. WHERE C.contacto NOT IN('EXCELENTE','BUENO')
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/06/2011, 09:48
 
Fecha de Ingreso: abril-2006
Ubicación: Bogotá
Mensajes: 251
Antigüedad: 18 años, 6 meses
Puntos: 14
Respuesta: Restringir SELECT

Hola, gracias por responder, en realidad la consulta es un "poco" mas compleja .. la reduje para que fuera mas facil de entender, mira la que estoy intentando:


Código SQL:
Ver original
  1. SELECT DISTINCT cliente.id_cliente
  2. FROM call_formulario formu
  3. INNER JOIN call_cliente cliente ON cliente.id_cliente = formu.id_cliente
  4. INNER JOIN call_contactos contacto ON contacto.id_cliente = formu.id_cliente
  5. WHERE formu.entrevista_fecha >=  '2009-01-01 00:00:00'
  6. AND contacto.id_subtipo NOT
  7. IN ('6','7','8','9','0')

En realidad el campo id_subtipo esta enlazado con otra tabla pero no quiero que me traiga los que tienen algún contacto 6,7,8,9,0

La probé así (todas las tablas se enlazan con el id_cliente) pero al validar algunos id_cliente que me arroja como resultado me siguen saliendo algunos que tienen contacto con id_subtipo 6,7,8,9,0 .. Como comentaba un cliente puede tener 20 gestiones .. me interesa saber solo cuales nunca han tenido una del tipo 6,7,8,9,0

¿Estaré haciendo algo mal? Espero me puedas ayudar.
  #4 (permalink)  
Antiguo 08/06/2011, 10:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Restringir SELECT

La mas de las veces, reducir una consulta para que se entienda "mejor", ahce que se entiend directamente MAL y que lo que se quiere proponer resulte inaplicable.
Acostúmbrate a poner lo que realmente es, no simulaciones porque el SQL no es un lenguaje para hacer eso. Es un lenguaje de búsquedas precisas y lo parecido generalmente no resulta ser lo mismo.

Reflexiones aparte, el modelo que te proponía era sobre la base de dos campos, donde un IF() puede resolver la dicotomía. Pero tu caso no se asemeja ni por las tapas.
IN() es en esencia un OR, lo que implica que dará por buenos todos aquellos que al menos cumplan con uno de los parámetros. Y eso no es lo que tu quieres.
Hay varias formas de encararlo, una de ellas es con LEFT JOIN y un NOT IN:

Código MySQL:
Ver original
  1.     cliente.id_cliente
  2.     call_formulario F
  3.     INNER JOIN
  4.     call_cliente C ON F.id_cliente = C.id_cliente
  5.     LEFT JOIN
  6.         (SELECT DISTINCT id_cliente
  7.         FROM call_contactos
  8.         WHERE id_subtipo NOT IN ('6','7','8','9','0')) CC ON CC.id_cliente = F.id_cliente
  9.     DATE(F.entrevista_fecha) >=  '2009-01-01'
  10.    AND CC.id_cliente IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: restringir, select
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 13:42.