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

Select un poco complicado?

Estas en el tema de Select un poco complicado? en el foro de Mysql en Foros del Web. Saludos. Imaginemos la siguiente tabla: Tabla X, con: Id | CampoA | CampoB ------------------------------------ 1 | 1 | 0 2 | 1 | 1 3 ...
  #1 (permalink)  
Antiguo 29/02/2012, 09:05
 
Fecha de Ingreso: febrero-2007
Mensajes: 6
Antigüedad: 17 años, 2 meses
Puntos: 0
Select un poco complicado?

Saludos.

Imaginemos la siguiente tabla:

Tabla X, con:
Id | CampoA | CampoB
------------------------------------
1 | 1 | 0
2 | 1 | 1
3 | 2 | 1
4 | 2 | 1

Quiero seleccionar el CampoA cuyo CampoB sea igual a 1, pero que no contenga valores de CampoA cuyo CampoB sea igual a 0.

Esto es, para mi consulta, debería devolverme como único valor CampoA = 2, puesto que con CampoA igual a 1 tenemos un CampoB = 0 y por lo tanto no se cumple la condición que pido.

¿Alguien sabría hacerlo del modo más sencillo posible?
Muchas gracias.
  #2 (permalink)  
Antiguo 29/02/2012, 09:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Select un poco complicado?

Hola atinatina:

¿Qué es lo que haz intentado hacer? desde mi punto de vista la consulta es bastante sencilla, podrías resolverla filtrando con NOT EXISTS o NOT IN.

Por qué no nos pones algo del código tengas y con gusto te ayudamos a afinar la consulta.

Saludos
Leo.
  #3 (permalink)  
Antiguo 29/02/2012, 09:49
 
Fecha de Ingreso: febrero-2007
Mensajes: 6
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Select un poco complicado?

No se como hacerlo...

SELECT DISTINCT(CampoA) FROM X WHERE CampoB = 1 AND...

Al final no se que usar...
  #4 (permalink)  
Antiguo 29/02/2012, 10:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Select un poco complicado?

No esperes que se te ponga aquí una respuesta simplemente para copiar y pegar... aquí podrás encontrar guías que te pueden ayudar a resolver tu problema, pero a final de cuentas eres tú quien debe hacer el trabajo....

En mi post te decía que puedes utilizar NOT EXISTS o NOT IN para filtrar los resultados... ¿No sabes como usar estas sentencias? bueno, puedes acudir a la documentación.

http://dev.mysql.com/doc/refman/5.0/...ubqueries.html

La sentencia NOT in funciona de manera parecida, pero sólo puede comparar un campo:

Código:
...WHERE Campo NOT IN (1,2,3)...
o
...WHERE Campo NOT IN (select campo from tabla where condición) ...
Saludos
Leo.
  #5 (permalink)  
Antiguo 29/02/2012, 10:04
 
Fecha de Ingreso: febrero-2007
Mensajes: 6
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Select un poco complicado?

Vale, te aclaro...quería hacerlo sin usar subconsultas, he probado con un SELF JOIN, pero nones. Así que reformularé mi pregunta (y perdona por no haberlo aclarado antes), ¿es posible hacer dicha consulta sin usar subconsultas? Te pido disculpas por haberte hecho perder el tiempo, culpa mía.
  #6 (permalink)  
Antiguo 29/02/2012, 10:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Select un poco complicado?

Hola de nuevo...

Así ya cambia la cosa... lo que preguntas ahora nada tiene que ver a la forma en que planteaste tu problema original. Lo puedes hacer utilizando un LEFT JOIN sobre la misma tabla (utilizando un alias) checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------+--------+
  3. | Id   | CampoA | CampoB |
  4. +------+--------+--------+
  5. |    1 |      1 |      0 |
  6. |    2 |      1 |      1 |
  7. |    3 |      2 |      1 |
  8. |    4 |      2 |      1 |
  9. +------+--------+--------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT T1.*, T2.* FROM tabla T1
  13.     -> LEFT JOIN tabla T2
  14.     -> ON T1.CampoA = T2.CampoA AND T2.CampoB = 0
  15.     -> WHERE T1.CampoB = 1;
  16. +------+--------+--------+------+--------+--------+
  17. | Id   | CampoA | CampoB | Id   | CampoA | CampoB |
  18. +------+--------+--------+------+--------+--------+
  19. |    2 |      1 |      1 |    1 |      1 |      0 |
  20. |    3 |      2 |      1 | NULL |   NULL |   NULL |
  21. |    4 |      2 |      1 | NULL |   NULL |   NULL |
  22. +------+--------+--------+------+--------+--------+
  23. 3 rows in set (0.02 sec)

Observa que utilizo dos alias para la misma tabla (T1, T2). Para el LEFT JOIN estoy poniendo en el ON la unión por CampoA, pero estoy filtrando SÓLO AQUELLOS REGISTROS QUE TENGAN UN CAMPOB=0. Para el FROM estoy seleccionando sólo los registros con Campo B = 1... al hacer la unión observa que sólo el primer caso tiene información correspondiente a la tabla LEFT... pues aquí sí se da el caso de un registro que tiene a la vez CampoB = 1 y CampoB = 0...

Para completar la consulta lo único que faltaría es agregar con un AND en la condición final T2.CampoA is null (o T2.id o T2.CampoB... es exactamente lo mismo) y modificar el select para que te regrese sólo el dato que quieres.

Dale un vistazo para ver si es lo que necesitas.

Finalmente una duda existencial: ¿Por qué razón no quieres/puedes usar subconsultas?

Saludos
Leo.
  #7 (permalink)  
Antiguo 29/02/2012, 13:19
 
Fecha de Ingreso: febrero-2007
Mensajes: 6
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Select un poco complicado?

Acabo de ver tu respuesta, no podré mirarla a fondo hasta mañana, pero SI! eres un genio de las consultal SQL mañana por la mañana lo miro en profundidad.
MIL GRACIAS!

El por qué hacerlo así y no con subconsulta, era simplemente por que tenía el presentimiento de que una subconsulta sería más lenta. He de decir que no lo he comprobado aun, pero era una intuición (erronea posiblemente...)

Última edición por atinatina; 01/03/2012 a las 01:11

Etiquetas: 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 16:27.