使用多个条件过滤 EAV table
Filtering EAV table with multiple conditions
我有 2 个表:
Table objects
:
object_id | object_group_id
Table 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'
...但还是得不到我想要的
试试这个。我不确定你为什么有最后几行
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';
经过几个小时的组合和尝试,我终于做到了:
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
。
我有 2 个表:
Table objects
:
object_id | object_group_id
Table 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'
...但还是得不到我想要的
试试这个。我不确定你为什么有最后几行
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';
经过几个小时的组合和尝试,我终于做到了:
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
。