わかりました、まず最初に、タイトルについて申し訳ありませんが、より良いタイトルを見つけることができませんでした:(
これが問題です:
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 BY
たHAVING
。リクエストから情報を取得するため、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
ステートメントになるのではないかと心配しています...