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

DUDA AND en WHERE

Estas en el tema de DUDA AND en WHERE en el foro de Mysql en Foros del Web. Hola! que tal? Tengo una duda con el uso de AND en un WHERE, no soy usuario avanzado de mySQL. Necesito sacar los registros de ...
  #1 (permalink)  
Antiguo 29/04/2012, 20:28
 
Fecha de Ingreso: diciembre-2011
Mensajes: 3
Antigüedad: 12 años, 4 meses
Puntos: 0
DUDA AND en WHERE

Hola! que tal?

Tengo una duda con el uso de AND en un WHERE, no soy usuario avanzado de mySQL.
Necesito sacar los registros de una misma busqueda, ya que voy a paginar los resultados.
El detalle es que hay 4 tipos de usuarios , los primeros 3 tienen en sus anuncios una caducidad de 90 días y el cuarto tipo tiene caducidad de 15 días.
Y al ordenar los resultados de la consulta tengo que dar prioridad a los primeros 3 tipos, aparte que los resultados deben de ser al azar.

Tengo esta busqueda:

Código PHP:
$sqluser="SELECT casas.id,casas.nombre,casas.metros,casas.precio,casas.id_contratante,casas.foto1,usuarios.id,usuarios.tipo FROM casas,usuarios WHERE (usuarios.id=casas.id_contratante AND usuarios.tipo!='4' AND casas.vigencia BETWEEN '".$date90."' AND '".$date."'".$valor.") AND (usuarios.id=casas.id_contratante AND usuarios.tipo='4' AND casas.vigencia BETWEEN '".$date15."' AND '".$date."'".$valor.") ORDER BY usuarios.tipo ASC, rand(".$_SESSION['tiempo'].") LIMIT 10"
El valor de la variable $valor es:
Código PHP:
 $valor=" AND precio BETWEEN '1200000.00' AND '1300000.00'"
Y otros pero con este valor tienen para completar la busqueda.

No me regresa algún resultado.
Si ejecuto por separado cada WHERE me da bien.
¿Que tengo que hacer para que me regrese en una sola consulta los resultados?

Gracias!

Última edición por mundoco12; 29/04/2012 a las 20:36 Razón: Perdón, se me paso poner el valor de $valor
  #2 (permalink)  
Antiguo 30/04/2012, 08:42
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, 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)
  #3 (permalink)  
Antiguo 30/04/2012, 15:16
 
Fecha de Ingreso: diciembre-2011
Mensajes: 3
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: DUDA AND en WHERE

Hola gracias por responderme y resolver mi problema.

Después del regañadon que me pusiste por usar AND y que debia de usar un OR que lo entiendo perfectamente, el detalle es que no se si por presión o algo, no carburas en el momento.
Pero lo que le quería decir a la consulta es que me mostrara: estos AND esos en lugar de estos OR esos. Y si la verdad nunca pense que estaba contradiciendo la consulta. Pero bueno.

Te agradezco tu tiempo y tu conocimiento y sobre todo la explicación, ya que es lo que para mi mas cuenta, ya que me enseñas el razocinio y lo puedo aplicar en nuevas cosas.

De nuevo ¡Gracias!
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 19:15.