我正在开发属性项目,用户在某个地方搜索属性。
在获取相关结果后,我想显示一些不应包含先前显示结果的暗示结果。
表架构是:
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
答案 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将获取不包含传递位置的结果。
优化此查询的步骤。
只选择必填列,不要使用*
使用限制例如: - select * from property where property ="House/Villa" and city="city1" and locality NOT IN(loc1) limit 0,30;
//这将仅获取前30个结果。你可以按照你的方式设置。
使用正确的查询和子查询选择过滤的数据
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的一部分。所以它不会限制结果,而是给我们一个值排序,所以匹配本地的项目将是第一个,建议将在最后。
我还在每个参数周围添加了一个转义函数,因为你肯定想要清理用户的任何输入。