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

时间:2013-09-07 05:32:53

标签: php mysql sql

我正在开发属性项目,用户在某个地方搜索属性
在获取相关结果后,我想显示一些不应包含先前显示结果的暗示结果。

表架构是:

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     |
+-----+-------------+-----------+-------------+------+----------+

我希望,如果用户在城市 House/Villa地区 city1中搜索loc1,那么以及可用结果我想建议他在同一个城市与其他地区的其他房产 什么是SQL查询。我要在PHP

中使用它

4 个答案:

答案 0 :(得分:4)

让你的第一个查询是

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. Not in对于大型结果来说很慢b / c mysql首先扫描全表然后应用Not IN,所以你可以去NOT EXISTS()而不是NOT IN()。

答案 1 :(得分:1)

试试这个:

正确答案:

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'

答案 2 :(得分:1)

$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。

答案 3 :(得分:1)

您应该只使用一个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语句中的locality if语句作为select的一部分。所以它不会限制结果,而是给我们一个值排序,所以匹配本地的项目将是第一个,建议将在最后。

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