2013-09-07 3 views
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 в городеcity1 и местностиloc1 затем вместе с имеющимися результатами, я хотел бы предложить его для других свойств в тот же город с другим местность.
Каким будет запрос SQL. Я использовать его в PHP

+0

Я мало знаю о 'sql'-запросах, кроме' insert', 'update' или' delete' –

+0

Вы хотите, чтобы тот же тип свойств в разных местах с тем же городом в результате, включается в результат, если критерии поиска: 'property = 'House/Villa' AND city = 'city1' AND locality = 'loc1'', пожалуйста, укажите образец результата для того же условия? –

+0

№. 'office' не будет включен –

ответ

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. Не в медленно работает большой результат б/с MySQL первого сканирования всей таблицы затем применить не IN, так что вы можете пойти на NOT EXISTS() вместо НЕ В().

+0

. Я думаю, что запрос предложения займет больше времени, если число результатов велико. –

+0

вы можете уменьшить получаемый результат без ограничения. Если это серьезная проблема, вам нужно обратиться за запросом. оптимизация. @ MohammadFaisal – developerCK

+0

есть. Как бы оптимизировать этот запрос? –

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

Должен ли я использовать' IN' или 'NOT IN'? –

+0

Если вы хотите иметь свойства в том же «городе», то используйте 'IN' –

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.

+0

Это хорошо. Но я не использую 'PDO' –

+0

Не имеет значения, вы можете использовать все, что хотите, просто выполните запрос с помощью другой функции PHP и просмотрите результаты. – Soosh

+0

Нет. На самом деле, я должен сначала показать правильные совпадения, а затем после предложений –

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

Это ставит локальность, если заявление в если заявление как часть выбора. Таким образом, это не ограничивает результаты, но вместо этого дает нам значение для сортировки, поэтому элементы, которые соответствуют местоположению, будут первыми, и предложения будут в конце.

Я также добавил функцию эвакуации вокруг каждого параметра, потому что вы определенно хотите дезинформировать любой вход пользователя.

+0

'if (_, 1,0)' как это работает? –

+0

@ Давид, хороший, но есть ли способ узнать, сколько результатов есть предложения или фактические результаты? – Soosh

+0

if - простая функция в SQL (я ссылаюсь на MySQL для этого: http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_if). В основном я беру значение проверки и устанавливаю ее для элемента, который возвращается с результатами ('locality_match'). Я также заказываю так, чтобы матчи были первыми. –