2017-02-28 29 views
-1

我试图从postgresSQL中设置下列数据中获得最佳匹配。Postgres选择精确匹配ovet集合的行

数据集例如:(以下数据集属于父母或我要说的是我保持的表称为tbl_parent_meta_data动态父属性)

Filters: Brand=BMW, Wheels=17 & Model=B2017 

根据上面的过滤器,SQL应该返回parentId的唯一匹配滤波器,即:9080 & 9082号文件

+----+----------+-------------+---------------+ 
| Id | AdId  | MetaDataKey | MetaDataValue | 
+----+----------+-------------+---------------+ 
| 1 |  9080 | Brand  | BMW   | 
| 2 |  9080 | Wheels  | 17   | 
| 3 |  9080 | Model  | B2017   | 
| 4 |  9081 | Brand  | BMW   | 
| 5 |  9081 | Wheels  | 18   | 
| 6 |  9081 | Model  | B2016   | 
| 7 |  9082 | Brand  | Audi   | 
| 8 |  9082 | Wheels  | 19   | 
| 9 |  9081 | Model  | A2016   | 
| 10 |  9082 | Brand  | BMW   | 
| 11 |  9082 | Wheels  | 17   | 
| 12 |  9082 | Model  | B2017   | 
+----+----------+-------------+---------------+ 

查询我用:这工作对我来说,我需要的替代品。

SELECT axd.ad_id adId 
FROM ads_extradata axd 
LEFT JOIN ads a on a.id = axd.ad_id 
LEFT JOIN categories_translations ct ON ct.id = a.category_translation_id 
LEFT JOIN categories_meta_data cmd ON cmd.id = axd.category_metadata_id 
LEFT JOIN languages l ON l.id = ct.language_id 
WHERE cmd.deleted = false AND ct.deleted = false AND a.deleted = false  
AND axd.deleted = false 
AND a.category_translation_id = '" . $categoryTranslation->getId() . "' 
GROUP BY axd.ad_id 
HAVING SUM(
CASE 'Brand' WHEN axd.extra_value::text THEN 10 ELSE 0 END + 
CASE 'Wheels' WHEN axd.extra_value::text THEN 10 ELSE 0 END + 
CASE 'Model' WHEN axd.extra_value::text THEN 10 ELSE 0 END) >= 30 
+0

你尝试过什么查询? –

+0

谢谢Radu,我用我用过的查询更新了这个问题,结果很好。但是可以替代 – danyal14

回答

1

假设,你可以提取你的过滤器,并应用于查询

那么你可以做

SELECT parentid 
FROM table_name 
WHERE (metadatakey, metadatavalue) IN (
     ('Brand', 'BMW'), 
     ('Wheels', '17'), 
     ('Model', 'B2017') 
    ) 
GROUP BY parentid 
HAVING COUNT(DISTINCT metadatakey) = 3; --number of equality filter 
--If you don't have duplicate (metadatakey, metadatavalue) for each 
-- parentid then use COUNT(*) instead 
+1

“where”子句可以简化为(('Brand','BMW'),('Wheels','17'),('Model','B2017 '))' –

+0

感谢您的回复,我会在今天进行测试,然后回复您。 – danyal14