1 votos

Consultas SQL inversa

Tengo 4 tablas

*Clientes (g_clients)

*Búsquedas de Cliente (g_client_search)

*Distritos de la búsqueda del cliente (g_client_search_distrit)

*Propiedades (g_propertys)

Para obtener las propiedades que coincidan con la búsqueda del clientes es muy fácil lo he echo de la siguiente forma:

$query_GetDistritsSearch2 = sprintf("SELECT * FROM g_client_search_distrit WHERE id_search = %s", $reg_search[$i]["id"], "int");
                                    $GetDistritsSearch2 = mysqli_query($conexion,$query_GetDistritsSearch2) or die(mysqli_error());
                                    $row_GetDistritsSearch2 = mysqli_fetch_assoc($GetDistritsSearch2);
                                    $totalRows_GetDistritsSearch2 = mysqli_num_rows($GetDistritsSearch2);

                                    if($totalRows_GetDistritsSearch2>0){$distrit=$row_GetDistritsSearch2['id_distrit'];}else{unset($distrit);}
                                    if($reg_search[$i]['id_operation']>0){$operation=$reg_search[$i]['id_operation'];}else{unset($operation);}
                                    if($reg_search[$i]['id_property_type']>0){$type=$reg_search[$i]['id_property_type'];}else{unset($type);}
                                    if($reg_search[$i]['area_min']>0){$areamin=$reg_search[$i]['area_min'];}else{unset($areamin);}
                                    if($reg_search[$i]['area_max']>0){$areamax=$reg_search[$i]['area_max'];}else{unset($areamax);}
                                    if($reg_search[$i]['price_min']>0){$pricemin=$reg_search[$i]['price_min'];}else{unset($pricemin);}
                                    if($reg_search[$i]['price_max']>0){$pricemax=$reg_search[$i]['price_max'];}else{unset($pricemax);}
                                    if($reg_search[$i]['bedroom']>0){$bedroom=$reg_search[$i]['bedroom'];}else{unset($bedroom);}
                                    if($reg_search[$i]['bathroom']>0){$bathroom=$reg_search[$i]['bathroom'];}else{unset($bathroom);}
                                    if($reg_search[$i]['garage']>0){$garage=$reg_search[$i]['garage'];}else{unset($garage);}

                                    unset($conditions);
                                    $conditions = "WHERE status=1 && dateinit>'$dateend' ";

                                    $d=0;
                                    if($totalRows_GetDistritsSearch2>1){
                                        $conditions .= "&& (";
                                        do {$d++;
                                            if($d!=$totalRows_GetDistritsSearch2){
                                                $distrit=$row_GetDistritsSearch2["id_distrit"];
                                                $conditions .= sprintf("(id_distrit = %s) OR ", $distrit);
                                            }else{
                                                $distrit=$row_GetDistritsSearch2["id_distrit"];
                                                $conditions .= sprintf("(id_distrit = %s))", $distrit);
                                            }
                                        }while ($row_GetDistritsSearch2 = mysqli_fetch_assoc($GetDistritsSearch2));
                                    }elseif($totalRows_GetDistritsSearch2>0){
                                        $conditions .= sprintf("&& id_distrit = %s", $distrit);
                                    }

                                    if (isset($operation)){
                                        $conditions .= sprintf("&& id_operation = %s", $operation);
                                    }
                                    if (isset($type)){
                                        $conditions .= sprintf("&& id_property_type = %s", $type);
                                    }
                                    if (isset($areamin)){
                                        $conditions .= sprintf("&& area >= %s", $areamin);
                                    }
                                    if (isset($areamax)){
                                        $conditions .= sprintf("&& area <= %s", $areamax);
                                    }
                                    if (isset($pricemin)){
                                        $conditions .= sprintf("&& price >= %s", $pricemin);
                                    }
                                    if (isset($pricemax)){
                                        $conditions .= sprintf("&& price <= %s", $pricemax);
                                    }
                                    if (isset($bedroom)){
                                        $conditions .= sprintf("&& bedroom = %s", $bedroom);
                                    }
                                    if (isset($bathroom)){
                                        $conditions .= sprintf("&& bathroom = %s", $bathroom);
                                    }
                                    if (isset($garage)){
                                        $conditions .= sprintf("&& garage = %s", $garage);
                                    }
                                    $query_GetMatch = sprintf("SELECT * FROM g_propertys ".$conditions);
                                    $GetMatch = mysqli_query($conexion,$query_GetMatch) or die(mysqli_error());
                                    $row_GetMatch = mysqli_fetch_assoc($GetMatch);
                                    $totalRows_GetMatch = mysqli_num_rows($GetMatch);

Lo que he echo es simplemente listar todas las Busquedas de los Clientes y de acuerdo a las características aplicar una condicional para buscar propiedades que coincidan con los requisitos y así mismo un while para los distritos ya que una búsqueda puede considerar hasta 5 distritos como resultado obtengo lo siquiente:

enter image description here

Ahora el problema esta en que en la lista de las propiedades quiero hacer el cruce con las coincidencias de búsquedas, pero si parto con los datos de la propiedad en muchos casos no cumpliría dicho cruce.

enter image description here

Porfa necesito una mano con ello, cualquier dato que les pueda brindar estaré al tanto para responderlas.

0voto

aEscarcha Puntos 220

No entiendo que datos te faltan en las propiedades para que no los puedas comparar con las búsquedas... ¿prioridad? ¿por qué no ignoras esos campos?

Otra opción, es que en vez de mostrar directamente el número de matches en el primer sitio, recuperes los registros y los pases a una tabla intermedia g_client_search_result , o incluso los guardes en un almacén fuera de SQL como puede ser Redis. Después ya muestras el count() del array, y cuando vayas por el otro lado puedes sacar la cuenta facilmente.

0 votos

Por ejemplo en caso que una búsqueda no tenga distritos o que no especifique la cantidad de dormitorios o baños

0 votos

¿Y como se refleja eso en la tabla client_search? Si lo reflejas con null, o un *, puedes hacer la segunda query con OR, o IN()

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: