Search code examples
mysqlsqlentity-attribute-value

Filtering EAV table with multiple conditions


I have 2 tables:

Table objects:

object_id | object_group_id

Table attributes:

attr_id | attr_object_id | attr_property_id | attr_value

Now, I want to get all object_id where object_group_id = 1 and filters two attributes:

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

I was trying to construct some queries, like this:

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'

... but still can't get what I need.


Solution

  • After couple hours of combining and trying, I finally did:

        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
    

    I was too close, and done this by moving all filter conditions to INNER JOIN.