ゴージャス:
私は2つのテーブルを持っているproperty
とproperty_meta
、property
テーブルには、すべてのレコードが含まれており、property_meta
代わりに、各プロパティのすべての機能と深さの詳細が含まれています。
私は、次のオプションパラメータを使用して、プロパティを検索したいと思います:
- 題名
- エリアID
- 地域ID
- 街のID
property
テーブルには、以下の構造を有します:
| id | title | deleted
1 test 0
2 test2 0
そしてproperty_meta
、この構造を持っています:
| id | property_id | meta_key | meta_value
1 1 property_area 1208
2 1 property_region 1207
3 1 property_city 1237
4 2 property_area 1208
5 2 property_region 1207
6 2 property_city 1237
私は、次のクエリを作成しました:
SELECT p.*
FROM property p
INNER JOIN property_meta pm ON p.id = pm.property_id
WHERE LOWER(p.name) LIKE concat("%%") AND p.deleted = 0
AND (pm.meta_key = 'property_area' AND pm.meta_value IN (1208))
AND (pm.meta_key = 'property_region' AND pm.meta_value IN (1207))
AND (pm.meta_key = 'property_city' AND pm.meta_value IN (1237))
GROUP BY p.id
残念ながら、このクエリは、空の結果を返しますが、私は、以下の条件を削除する場合:
AND (pm.meta_key = 'property_region' AND pm.meta_value IN (1207))
AND (pm.meta_key = 'property_city' AND pm.meta_value IN (1237))
私は私がやったどの間違い、両方の行を取得しますか?
NBK:
クエリを実行したときと句が排他的であるので、彼らは1行ですべて有効でcan_'t。
あなたはすべての3つは、私の例のような和によって例えば一度に有効であるかどうかを確認する必要があります
使用だから、
SELECT
p.id
FROM
property p
INNER JOIN
(SELECT
`property_id`
FROM
property_meta pm
GROUP BY `property_id`
HAVING SUM(pm.meta_key = 'property_area'
AND pm.meta_value IN (1208)) + SUM(pm.meta_key = 'property_region'
AND pm.meta_value IN (1207)) + SUM(pm.meta_key = 'property_city'
AND pm.meta_value IN (1237)) = 3) pm ON p.id = pm.property_id
WHERE
LOWER(p.title) LIKE CONCAT('%%')
AND p.deleted = 0
GROUP BY p.id
CREATE TABLE property ( `id` INTEGER, `title` VARCHAR(5), `deleted` INTEGER ); INSERT INTO property (`id`, `title`, `deleted`) VALUES ('1', 'test', '0'), ('2', 'test2', '0'); CREATE TABLE property_meta ( `id` INTEGER, `property_id` INTEGER, `meta_key` VARCHAR(15), `meta_value` INTEGER ); INSERT INTO property_meta (`id`, `property_id`, `meta_key`, `meta_value`) VALUES ('1', '1', 'property_area', '1208'), ('2', '1', 'property_region', '1207'), ('3', '1', 'property_city', '1237'), ('4', '2', 'property_area', '1208'), ('5', '2', 'property_region', '1207'), ('6', '2', 'property_city', '1237');
✓ ✓ ✓ ✓
SELECT p.id FROM property p INNER JOIN (SELECT `property_id` FROM property_meta pm GROUP BY `property_id` HAVING SUM(pm.meta_key = 'property_area' AND pm.meta_value IN (1208)) + SUM(pm.meta_key = 'property_region' AND pm.meta_value IN (1207)) + SUM(pm.meta_key = 'property_city' AND pm.meta_value IN (1237)) = 3) pm ON p.id = pm.property_id WHERE LOWER(p.title) LIKE CONCAT('%%') AND p.deleted = 0 GROUP BY p.id
| ID | | - :| | 1 | | 2 |
SELECT `property_id` FROM property_meta pm GROUP BY `property_id` HAVING SUM(pm.meta_key = 'property_area' AND pm.meta_value IN (1208)) + SUM(pm.meta_key = 'property_region' AND pm.meta_value IN (1207)) + SUM(pm.meta_key = 'property_city' AND pm.meta_value IN (1237)) = 3
| PROPERTY_ID | | ----------:| | 1 | | 2 |
DB <>フィドルこちら