Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/04/2012, 08:42
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: DUDA AND en WHERE

Cita:
¿Que tengo que hacer para que me regrese en una sola consulta los resultados?
Lo primero que tienes que entender es cómo funciona un AND. Si jamás has estudiado lógica propposicional y no has visto lo que se denominan "tablas de verdad", entonces no sabes que un conjunto de proposiciones condicionados con AND (Y) sólo son verdaderos si todas las proposiciones son verdaderas.
Esto significa que para que un WHERE de múltilples condiciones relacionadas con AND devuelva datos, todas las condiciones puestas en el WHERE deben cumplirse si o sí, todas en el mismo registro dado. Con una sola que no se cumpla al mismo tiempo que las otras, MYSQL no devolverá ese registro.
¿Se entiende la idea?

Bien, lo que tu tienes es esto:
Código MySQL:
Ver original
  1.     casas.id,
  2.     casas.nombre,
  3.     casas.metros,
  4.     casas.precio,
  5.     casas.id_contratante,
  6.     casas.foto1,
  7.     usuarios.id,
  8.     usuarios.tipo
  9.     casas,
  10.     usuarios
  11.     (usuarios.id=casas.id_contratante AND usuarios.tipo!='4' AND casas.vigencia BETWEEN '".$date90."' AND '".$date."'".$valor.")
  12.     AND
  13.     (usuarios.id=casas.id_contratante AND usuarios.tipo='4' AND casas.vigencia BETWEEN '".$date15."' AND '".$date."'".$valor.")
  14.     usuarios.tipo ASC,
  15.     rand(".$_SESSION['tiempo'].")
Hay algunas cosas a notar:
1) Cuando pones una operación (... AND ...) AND (... AND ...), por transitividad, es exactamente igual que poner ... AND ... AND ... AND ..., con lo que los paréntesis no afectan el resultado.
2) Hay condiciones imposibles, como usuarios.tipo, ya que consultas por igual y diferente, lo cual es una contradicción. O es igual a 4 o es diferente de cuatro. No puede ser ambas cosas al mismo tiempo.
4) Estas usando condiciones en el WHERE que corresponden al JOIN. En tu caso corresponde poner ambas tablas en un INNER JOIN.
4) Lo que las lógicas de consulta buscadas es en realidad la comparación de fechas, pero para hacerla correctamente ambos BETWEEN deben ir con OR.

Tu consulta debería escribirse así (usando alias donde se debe y un correcto JOIN):
Código MySQL:
Ver original
  1.     C.id,
  2.     C.nombre,
  3.     C.metros,
  4.     C.precio,
  5.     C.id_contratante,
  6.     C.foto1,
  7.     U.id,
  8.     U.tipo
  9.     usuarios U INNER JOIN casas C ON U.id=C.id_contratante
  10.     (U.id != 4  AND C.vigencia BETWEEN '".$date90."' AND '".$date."'".$valor.")
  11.     OR
  12.     (U.id = 4 AND C.vigencia BETWEEN '".$date15."' AND '".$date."'".$valor.")
  13.     U.tipo ASC,
  14.     rand(".$_SESSION['tiempo'].")
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)