Есть три таблицы: product, filter и attr.
Все эти таблицы соединяю с помощью оператора JOIN следующим образом:
// использую sql класс прослойку https://github.com/Hazard2/PHP-MySQLi-Database-Class
$this->sql->join("attr", "product.id = attr.connect", "LEFT");
$this->sql->join("filter", "product.id = filter.connect", "LEFT");
// поиск продуктов с опр. параметрами в таблице filter
$this->sql->where('filter.filter', '3'); // тут id типа фильтра, в данном случае объем памяти
$this->sql->where('filter.value', '64Gb'); // соответственно значение
// и вот тут косяк, дело в том что таких условий к выше указанным столбцам несколько,
// можно было бы использовать оператор IN (64Gb, 32Gb ...)
// но в этом случае оператор ищет одно из значений в столбце,
// как же сделать так что бы можно было к одному столбцу несколько жестких значений,
// жестких значит они должны быть найдены.
$this->sql->where('attr.name', 'type');
$this->sql->where('attr.value', $this->interface->title);
$this->sql->where('product.visibility', 0);
$result = $this->sql->get('product', null, ['product.id', 'product.name', 'product.price']);
В итоге этот код выдает не совсем то что нужно, быть может идти другим путем, искать фильтры а потом собирать товары по ключу, так как у каждого фильтра есть ключ конкретного принадлежащему товару.
UPD: Решил проблему с помощью JOIN filter as filter_1, filter_2, filter_2 ... пока не знаю на сколько это плохая реализация, зато работает.