Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2022, 11:37   #1
Arsenprog
Новичок
Джуниор
 
Регистрация: 25.11.2022
Сообщений: 3
По умолчанию SQL Запрос на фильтрацию атрибутов

Я пишу фильтр и застрял на моменте когда выбирают производителя я могу оставить доступные атрибуты для дальнейшей фильтрации то есть я оставляю атрибуты при сущие выбранному производителю но после выбора любого атрибута из оставшихся фильтр сбивается и раскрывает другие атрибуты не присущие этому производителю нужно что бы при выборе оставшихся атрибутов происходило фильтрация атрибутов на уменьшение оставшихся к примеру вот мой запрос

SELECT DISTINCT
pa.text as attr_value,
attr_d.name as attr_name,
attr.filter_showed as attr_show,
fil_t.name as attr_type,
attr.attribute_id as attribute_id,

COUNT((SELECT
pr2.product_id
FROM product pr2
WHERE pr2.product_id = pr.product_id
GROUP BY pr2.product_id
)) AS stock

FROM product_to_category pc
LEFT JOIN product pr ON (pc.product_id = pr.product_id)
LEFT JOIN product_attribute pa ON (pc.product_id = pa.product_id)
LEFT JOIN attribute attr ON (pa.attribute_id = attr.attribute_id)
LEFT JOIN attribute_description attr_d ON (attr.attribute_id = attr_d.attribute_id)
LEFT JOIN filter_type fil_t ON (attr.filter_type_id = fil_t.id)
WHERE pc.category_id = '1227'
AND attr.filter_on = 1
AND pr.status = 1

AND (pr.manufacturer_id = '13') GROUP BY pa.attribute_id, pa.text ORDER BY attr_d.name, stock DESC, attr_value ASC"

Здесь показано как я фильтрую по производителю а как фильтровать по атрибутам если я пропишу атрибуты как производителя тогда все атрибуты станут не доступные кроме того которого я выбрал всю голову сломал как сделать не знаю могу показать сайт !
Arsenprog вне форума Ответить с цитированием
Старый 25.11.2022, 12:15   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

одним SQL тут не обойтись

Необходимо динамически формировать сам SQL запрос с помощью того ЯП в котором делаете проект

типа передали 1 параметр
SQL = ..... where param1 = 1

передали два (уточнение)
SQL = ..... where (param1 = 1) && (param2 = 2)

Последний раз редактировалось ADSoft; 25.11.2022 в 12:20.
ADSoft вне форума Ответить с цитированием
Старый 25.11.2022, 18:10   #3
Arsenprog
Новичок
Джуниор
 
Регистрация: 25.11.2022
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
одним SQL тут не обойтись

Необходимо динамически формировать сам SQL запрос с помощью того ЯП в котором делаете проект

типа передали 1 параметр
SQL = ..... where param1 = 1

передали два (уточнение)
SQL = ..... where (param1 = 1) && (param2 = 2)
Это понятно я могу это сделать циклом

public function getAllAttribute($category_id, $filter_data) {

$sql = "
SELECT DISTINCT
pa.text as attr_value,
attr_d.name as attr_name,
attr.filter_showed as attr_show,
fil_t.name as attr_type,
attr.attribute_id as attribute_id,

COUNT((SELECT
pr2.product_id
FROM product pr2
WHERE pr2.product_id = pr.product_id
GROUP BY pr2.product_id
)) AS stock

FROM product_to_category pc
LEFT JOIN product pr ON (pc.product_id = pr.product_id)
LEFT JOIN product_attribute pa ON (pc.product_id = pa.product_id)
LEFT JOIN attribute attr ON (pa.attribute_id = attr.attribute_id)
LEFT JOIN attribute_description attr_d ON (attr.attribute_id = attr_d.attribute_id)
LEFT JOIN filter_type fil_t ON (attr.filter_type_id = fil_t.id)
WHERE pc.category_id = '" . (int) $category_id . "'
AND attr.filter_on = 1
AND pr.status = 1

";

if (!empty($filter_data['filter_filter'])) {

$index_man = 0;

if (isset($filter_data['filter_filter'][0])) {

if ($filter_data['filter_filter'][0]['form'] === 'manufacturer') {

$sql .= " AND (";

foreach ($filter_data['filter_filter'] as $key => $value) {

if ($value['form'] === 'manufacturer') {

if ($index_man == 0) {

$sql .= "pr.manufacturer_id = '" . $this->db->escape($value['id']) . "'";

} else {

$sql .= " OR pr.manufacturer_id = '" . $this->db->escape($value['id']) . "'";
}

$index_man = $index_man + 1;

}

}

$sql .= ")";

}

}
}

$sql .= " GROUP BY pa.attribute_id, pa.text ORDER BY attr_d.name, stock DESC, attr_value ASC";

$query = $this->db->query($sql);

$result = $this->groupByKey($query->rows);

return $result;
}
Arsenprog вне форума Ответить с цитированием
Старый 25.11.2022, 23:56   #4
Arsenprog
Новичок
Джуниор
 
Регистрация: 25.11.2022
Сообщений: 3
По умолчанию Вот пример

Цитата:
Сообщение от ADSoft Посмотреть сообщение
одним SQL тут не обойтись

Необходимо динамически формировать сам SQL запрос с помощью того ЯП в котором делаете проект

типа передали 1 параметр
SQL = ..... where param1 = 1

передали два (уточнение)
SQL = ..... where (param1 = 1) && (param2 = 2)
Это понятно я могу это сделать циклом

public function getAllAttribute($category_id, $filter_data) {

$sql = "
SELECT DISTINCT
pa.text as attr_value,
attr_d.name as attr_name,
attr.filter_showed as attr_show,
fil_t.name as attr_type,
attr.attribute_id as attribute_id,

COUNT((SELECT
pr2.product_id
FROM product pr2
WHERE pr2.product_id = pr.product_id
GROUP BY pr2.product_id
)) AS stock

FROM product_to_category pc
LEFT JOIN product pr ON (pc.product_id = pr.product_id)
LEFT JOIN product_attribute pa ON (pc.product_id = pa.product_id)
LEFT JOIN attribute attr ON (pa.attribute_id = attr.attribute_id)
LEFT JOIN attribute_description attr_d ON (attr.attribute_id = attr_d.attribute_id)
LEFT JOIN filter_type fil_t ON (attr.filter_type_id = fil_t.id)
WHERE pc.category_id = '" . (int) $category_id . "'
AND attr.filter_on = 1
AND pr.status = 1

";

if (!empty($filter_data['filter_filter'])) {

$index_man = 0;

if (isset($filter_data['filter_filter'][0])) {

if ($filter_data['filter_filter'][0]['form'] === 'manufacturer') {

$sql .= " AND (";

foreach ($filter_data['filter_filter'] as $key => $value) {

if ($value['form'] === 'manufacturer') {

if ($index_man == 0) {

$sql .= "pr.manufacturer_id = '" . $this->db->escape($value['id']) . "'";

} else {

$sql .= " OR pr.manufacturer_id = '" . $this->db->escape($value['id']) . "'";
}

$index_man = $index_man + 1;

}

}

$sql .= ")";

}

}
}

$sql .= " GROUP BY pa.attribute_id, pa.text ORDER BY attr_d.name, stock DESC, attr_value ASC";

$query = $this->db->query($sql);

$result = $this->groupByKey($query->rows);

return $result;
}
Arsenprog вне форума Ответить с цитированием
Старый 26.11.2022, 08:46   #5
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

Раз понятно - делайте, в чем вопрос то? И зачем писать по два раза? У нас не Баден-Баден
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Провести фильтрацию по дате _Dianka_ Помощь студентам 0 28.12.2016 17:25
Обойти фильтрацию Utkin Свободное общение 20 10.09.2014 17:32
Макрос на фильтрацию данных Hoochara Microsoft Office Excel 0 04.08.2011 10:07
D7+Paradox, как сделать фильтрацию данных? nursak Помощь студентам 7 27.05.2011 19:51
Как произвести фильтрацию данных Dronlion Microsoft Office Excel 2 12.04.2011 22:48