2015-10-29 127 views
2

过滤EAV表我有2个表:与多个条件

objects

object_id | object_group_id 

attributes

attr_id | attr_object_id | attr_property_id | attr_value 

现在,我想所有object_id其中object_group_id = 1和过滤器两个属性:

(attr_property_id = 1 AND attr_value <= '100000') 
    AND 
(attr_property_id = 2 AND attr_value > '2000') 

我试图建立一些疑问,比如:

SELECT * FROM objects as o 

/* filter1 join */ 
INNER JOIN 
    attributes AS f1 
     ON 
    o.object_id = f1.attr_object_id 
     AND 
    f1.attr_property_id = 1 

/* filter2 join */ 
INNER JOIN 
    attributes AS f2 
     ON 
    f1.attr_object_id = f2.attr_object_id 
     AND 
    f2.attr_property_id = 2 

WHERE 
    o.object_group_id = 1 
     AND 
    f1.attr_value <= '100000' 
     AND 
    f2.attr_value > '2000' 

...但还是不能让我需要什么。

+0

你想要有1行attr_values或2行。请从你想要的结果中显示一个样本 –

+0

我想为每个对象获得一行,这些属性匹配属性中的两个键值条件。 – WarGasm

+0

看看这个。它生成您的查询数据透视表 http://stackoverflow.com/questions/33350524/pivot-a-table-and-display-n-ordered-time-series/33351008?noredirect=1#comment54499334_33351008 –

回答

1

相结合,努力的几个小时后,我终于做到:

SELECT * FROM objects as o 

/* filter1 join */ 
INNER JOIN 
    attributes AS f1 
     ON 
    o.object_id = f1.attr_object_id 
     AND 
    f1.attr_property_id = 1 
     AND 
    f1.attr_value <= '100000' 

/* filter2 join */ 
INNER JOIN 
    attributes AS f2 
     ON 
    f1.attr_object_id = f2.attr_object_id 
     AND 
    f2.attr_property_id = 2 
     AND 
    f2.attr_value > '2000' 

WHERE 
    o.object_group_id = 1 

我太接近了,并通过将所有过滤条件移至INNER JOIN来完成此操作。

0

试试这个。我不知道为什么你有最后的行

SELECT 
    o.object_id, o.object_group_id, 
    f1.attr_value AS val1, 
    f2.attr_value AS val2, 
FROM objects AS o 
LEFT JOIN attributes f1 ON o.object_id = f1.attr_object_id AND f1.attr_property_id = 1 
LEFT JOIN attributes f1 ON o.object_id = f2.attr_object_id AND f2.attr_property_id = 2 
WHERE 
    o.object_group_id = 1 
AND 
    f1.attr_value <= '100000' 
AND 
    f2.attr_value > '2000'; 

删除此行并对其进行测试也

AND 
    f1.attr_value <= '100000' 
AND 
    f2.attr_value > '2000'; 
+0

我试过了使用'LEFT JOIN',但它永远不会比较多个键值对。它将所有的键值对分成独立的行。所以我无法比较两者。 – WarGasm