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/Villain city city1locality 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. use limit eg:- 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 IN() の代わりに NOT EXISTS() を使用できます。

于 2013-09-07T05:48:57.860 に答える
1

これは、たった 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";

これにより、select の一部として if ステートメントに locality if ステートメントが配置されます。結果を制限するのではなく、並べ替えの基準となる値を与えるので、地域に一致するアイテムが最初に表示され、候補が最後に表示されます。

また、ユーザーからの入力を確実にサニタイズする必要があるため、各パラメーターの周りにエスケープ関数を追加しました。

于 2013-09-07T06:02:41.213 に答える
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

これを試して :

適切な答えのために:

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 に答える