Цитата (kaww @ 3.06.2014 - 14:18) | ||
, Entity-Attribute-Value Data Model в гугле много информации можно найти. Судя по всему вы храните атрибуты как поля в таблице товаров. В этом случае, действительно, посчитать сколько товаров останется при добавлении фильтра достаточно проблематично. Как вариант можно построить таблицу вида [product_id, attribute_name, value], в которой продублировать значения атрибутов (которые используются в фильтрах) товаров из таблицы продуктов: |------------------------------------| Тогда можно воспользоваться запросом из моего предыдущего поста |
$filter = array(
'table' => 'odezhda',
'type' => 'kurtki',
'size' => 46,
'color' => 'black'
)
$table = $filter['table'];
unset($filter['table']);
$conditionArr = array();
foreach($filter as $k=>$v) {
$conditionArr[] = 'attribute_name=\'' $k . '\' and `value`=' . ((string)(int)$v === (string)$v ? $v :crc32($v)); // если значение уже в crc32, то условие не нужно
}
$sth = $pdo->query('select id, count(*) as count from product_attribute_value
where table=\'' . $table . '\' and ((' . implode(') or (', $conditionArr) . ')) group by id having `count` =' . count($filter));
$productIds = array_map(function($row) {return $row['id'];}, $sth->fetchAll());
//$productIds - содержит ид продуктов, которые удовлетворяют фильтру, получить товары select * from $table where product_id in ($productIds)
product_id - ид. товара.
table_name - таблица товара
attribute_name - название атрибута (имя колонки из таблицы товаров. color, size etc.)
value - crc32-хэш значения атрибута товара
$sth = $pdo->query('select `attribute`, `value`, count(*) as `count` from product_attribute_value where
product_id in (' , implode($productIds) . ') and attribute_name not in (\'' . implode('\',\'', array_keys($filter)) . '\') and `table`=\'' . $table . '\' group by `value`');
$filtersCount;//Заносим результат выборки по запросу. $filtersCount содержит информацию о имени атрибута, значении и количестве результатов если добавить фильтр по этому атрибуту. со значением value (crc32)