2

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

表架构是:

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我想,如果用户在city city1 and locality 搜索,loc1那么连同可用的结果,我想建议他在同一个城市与其他locality的其他属性。
会是什么SQL查询。我必须使用它PHP

4

4 回答 4

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);

如果您第一次向他展示多个位置的结果,并且想要省略它,那么您可以通过使用逗号分隔的字符串来传递数组,

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

于 2013-09-07T05:48:57.860 回答
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'
于 2013-09-07T05:43:36.163 回答
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。

于 2013-09-07T05:54:44.240 回答
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 语句放在 if 语句中作为选择的一部分。所以它不会限制结果,而是给我们一个排序依据的值,所以匹配位置的项目将是第一个,建议将在最后。

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

于 2013-09-07T06:02:41.213 回答