排除在搜索结果中首先获取的结果


exclude results which are fetched first in search result

我正在做一个属性项目,用户在其中搜索某些位置的属性。
获取相关结果后,我想显示一些建议性结果,这些结果不应包含之前显示的结果。

表架构为:

property table:
+-----+-------------+-----------+-------------+------+----------+
| id  | property    | amenities | description | city | locality |
+-----+-------------+-----------+-------------+------+----------+
| 1   | House/Villa |           | some desc   | cit1 | loc1     |
+-----+-------------+-----------+-------------+------+----------+
| 2   | Office      |   ....    | desc....    | cit1 | loc2     |
+-----+-------------+-----------+-------------+------+----------+
| 3   | House/Villa | .....     | desc....    | cit1 | loc3     |
+-----+-------------+-----------+-------------+------+----------+

我想要,如果用户在城市city1地区搜索House/Villa loc1那么除了可用结果外,我想建议他在同一城市与其他地方的其他房产。
SQL查询是什么。我必须在PHP中使用它

让你的第一个查询是

select * from property where city="city1" and locality="loc1" and property ="House/Villa";

然后对所需结果的查询应为

select * from property where  property ="House/Villa" and city="city1" and locality NOT IN(loc1);

如果您第一次向他显示多个位置的结果,并且想要省略它,那就更好了您可以通过 makin 传递一个逗号分隔的字符串,

$notIn = implode(", ", array("loc1","loc2"));

因此,NOT IN 将获取不包括传递位置的结果。

优化此查询的步骤。

  1. 选择仅必填列,不使用 *

  2. 使用限制,例如:- select * from property where property ="House/Villa" and city="city1" and locality NOT IN(loc1) limit 0,30;//这将仅获取前 30 名结果。 您可以根据自己的方式进行设置。

  3. 使用正确的查询和子查询选择筛选的数据

  4. 对于大结果b/c mysql首先扫描完整表然后应用Not IN,则不输入很慢,因此您可以选择NOT EXISTS()而不是NOT IN()。

您应该只需一个 SQL 查询即可执行此操作

$query = "SELECT *, IF(locality='" . mysqli_real_escape_string($locality) . "', 1, 0) as locality_match FROM property WHERE property = '" . mysqli_real_escape_string($property) . "'AND city = '" . mysqli_real_escape_string($city) . "' ORDER BY locality_match DESC";

这会将 if 语句中的局部性 if 语句作为选择的一部分。因此,它不会限制结果,而是为我们提供一个要排序的值,因此与位置匹配的项目将排在第一位,建议将排在最后。

我还在每个参数周围添加了一个转义函数,因为您肯定希望清理用户的任何输入。

$property = 'House/Villa';
$city = 'city1';
$locality = 'loc1';
$q = "SELECT * FROM property WHERE property = '" . $property . "'AND city = '" . $city . "'";
$stmt = pdoObject->prepare($q);
$stmt->execute() or die(print_r($stmt->errorInfo()));
$result = $stmt->fetchAll(PDO::FETCH_BOTH);
foreach($resukt as $res)
{
   if($res['locality'] == $locality)
    echo "your search result";
} 
foreach($resukt as $res)
{
   if($res['locality'] != $locality)
    echo "this is suggestion";
}

我假设您正在使用PDO。

试试这个:

对于正确的答案:

SELECT DISTINCT property, amenities, description, city, locality FROM property
WHERE property = 'House/Villa' AND city = 'city1' AND locality = 'loc1'

有关建议,请使用:

 SELECT DISTINCT property, amenities, description, city, locality FROM property
    WHERE property = 'House/Villa' AND city = 'city1' AND locality != 'loc1'