特定の条件を持つすべてのレコードを取得することはできません

ゴージャス:

私は2つのテーブルを持っているpropertyproperty_metapropertyテーブルには、すべてのレコードが含まれており、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 <>フィドルこちら

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=373409&siteId=1