1

わかりました、まず最初に、タイトルについて申し訳ありませんが、より良いタイトルを見つけることができませんでした:(
これが問題です:
2 つのテーブルがpropertiesありproperties_rooms、プロパティ ID によって相互にリンクされています。

properties table:

+---------------+------------+
| id_properties | pr_title   |
+---------------+------------+
|             1 | test       |
|             2 | dummy      |
+---------------+------------+

properties_rooms table:
+---------------+-------------------+--------------+----------+
| id_prop_rooms | pro_id_properties | pro_id_rooms | pro_size |
+---------------+-------------------+--------------+----------+
|             1 |                 1 |            4 |     5.00 |
|             2 |                 1 |           18 |    17.00 |
|             3 |                 2 |            6 |    12.00 |
|             4 |                 2 |           24 |    11.00 |
|             5 |                 1 |            4 |    10.00 |
|             6 |                 1 |            6 |    10.00 |
|             7 |                 1 |            6 |    12.00 |
+---------------+-------------------+--------------+----------+

私は高度な検索に取り組んでおり、ユーザーは同じタイプの部屋 (ベッドルームが 2 つ、バスルームが 3 つなど) が複数ある物件を検索できます。

悲しいことに、同じデータセットを複数の句で「フィルタリング」することはできないため、これに行き詰まっています。HAVING句 を使用できるため、1 つだけをフィルタリングする必要がある場合は問題ありません。

私はこの選択をしました:

SELECT id_properties, pro_id_rooms, COUNT(*) as total, 
        IF ((pro_id_rooms = 4 AND COUNT(*) >= 2) OR (pro_id_rooms = 6 AND COUNT(*) >= 2), 1, 0) as flag
FROM `properties`
INNER JOIN properties_rooms ON id_properties = pro_id_properties
WHERE id_properties IN (4,10)
GROUP BY id_properties, pro_id_rooms
ORDER BY id_properties

条項内INには、リクエストされた部屋が少なくとも 1 つあることがわかっているプロパティがあります。と を使用する必要があるため、以前のクエリから取得しましGROUP BYHAVING。リクエストから情報を取得するため、select 内
の部分は実行時にビルドされます。 結果は次のとおりです。 IF

+---------------+--------------+-------+------+
| id_properties | pro_id_rooms | total | flag |
+---------------+--------------+-------+------+
|             1 |            4 |     2 | 1    |
|             1 |            6 |     2 | 1    |
|             1 |           18 |     1 | 0    |
|             2 |            6 |     1 | 0    |
|             2 |           24 |     1 | 0    |
+---------------+--------------+-------+------+

うまくいくと思います。追加するだけでHAVING flag > 0完了です。

私の質問は、もっと良いものはありますか?
テーブルはそれほど大きくありません。プロパティ 1 は約 1k、ルーム 1 は約 10k です。
ユーザーが部屋を入れすぎると、クエリが膨大なIFステートメントになるのではないかと心配しています...

4

1 に答える 1

0
SELECT id_properties, SUM(pro_id_rooms = 4) AS bedrooms, SUM(pro_id_rooms = 6) AS bathrooms
FROM `properties`
INNER JOIN properties_rooms ON id_properties = pro_id_properties
WHERE id_properties IN (4,10)
GROUP BY id_properties
HAVING bedrooms >= 3 AND bathrooms >= 2

変更点

SUM(pro_id_rooms = 4) AS bedrooms, SUM(pro_id_rooms = 6) AS bathrooms

ユーザーが選択したチェックボックスごとに、にが必要SUM(pro_id_rooms = x) AS nrofxですWHERE

HAVING bedrooms >= 3 AND bathrooms >= 2

ここで特定の部屋の番号を確認します。

于 2012-06-15T14:50:09.830 に答える