Здравствуйте. Столкнулся с проблемой, не получается выцепить нужные товары из БД. Делаю поиск по сайту,
в БД хранятся данные:
`wp_posts` - информация о товарах
Напр., 'ID' => '8719' ,' post_title' => 'Кеды 1', 'post_type' = 'product'
`wp_term_relationships` - соответствия товаров и категорий
Напр., 'object_id' => '8719','term_taxonomy_id' => '273'
`wp_term_taxonomy` - более подробная информация о категории
Напр., 'term_taxonomy_id' => '273','term_id' => '273','taxonomy' => 'product_cat','parent' => '272'
Здесь ньюанс, к товару с id = 8719 Привязана только одна категория с id = 273. Но у этой категории есть родительские категории (они так же хранятся в `wp_term_taxonomy` ), а к товару они не привязаны.
'term_taxonomy_id' => '273','term_id' => '273','taxonomy' => 'product_cat','parent' => '272'
'term_taxonomy_id' => '272','term_id' => '272','taxonomy' => 'product_cat','parent' => '160'
'term_taxonomy_id' => '160','term_id' => '160','taxonomy' => 'product_cat','parent' => '0'
Нужно, чтобы при поиске по названию родительских категорий, так же показывался данный товар.
В таблице `wp_terms` хранится название категории.
'term_id' => '273','name' => 'Категория1','slug' => 'kategory1'
'term_id' => '272','name' => 'Категория2','slug' => 'kategory2'
'term_id' => '160','name' => 'Категория3','slug' => 'kategory3'
Написал функцию, которая получает список родительских категорий товара:DELIMITER //
CREATE FUNCTION br_get_parent_caterory_proc(var1 INT) RETURNS CHAR(100)
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'Get parent category procedure'
BEGIN
DECLARE parent_id INT;
DECLARE result, result_while, parent_id_vchar CHAR(100);
SET parent_id = 0;
SET parent_id_vchar = '';
SET result_while = '';
SET result = var1;
SET parent_id = (SELECT `parent` FROM wp_term_taxonomy WHERE `term_taxonomy_id` = var1);
SET result = concat(result, ", ", parent_id);
WHILE parent_id <> 0 DO
SET parent_id = ( SELECT `parent` FROM wp_term_taxonomy WHERE `parent` <> 0 AND `term_taxonomy_id` = parent_id );
IF (parent_id IS NOT NULL) THEN
SET parent_id_vchar = CONVERT(parent_id, CHAR(100));
SET result_while = concat(result_while, ", ", parent_id_vchar);
END IF;
END WHILE;
SET result = concat(result, result_while);
RETURN result;
END//
DELIMITER ;
SELECT br_get_parent_caterory_proc(273);
Выводит: 272, 160 (или можно сделать полный список 273, 272, 160)
Как можно сформировать запрос, чтобы в объединенных таблицах сформировался товар (дублировался), но у него былb все родительские категории? т.е. на выходе что-то вроде, т.е. Ищу Категория3 и должен найтись товар 8719
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '273', 'name' => 'Категория1
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '272', name' => 'Категория2',
'ID' => '8719' ,' post_title' => 'Кеды 1', 'term_id' => '160', 'name' => 'Категория3',
Пока пришел примерно к этому, но что не так? Бьюсь уже несколько дней, нид хелп) Спасибо.
SELECT *
FROM (((`wp_posts` p
INNER JOIN `wp_term_relationships` tr ON p.ID = tr.object_id)
INNER JOIN `wp_term_taxonomy` tt ON tt.term_taxonomy_id = tr.term_taxonomy_id)
INNER JOIN `wp_terms` t ON t.term_id IN (SELECT br_get_parent_caterory_proc(t.term_id))) -- = tt.term_id)
WHERE post_type = 'product' AND taxonomy = 'product_cat' AND name LIKE '%Категория3%'