Задать вопрос
vasmor
@vasmor
Интересуюсь

Как составить SQL запрос на получение дочерних категорий woocommerce, чьи дочерние категории имеют записи?

На сайте WP Woo есть такая структура категорий товаров:
Шины
- Летние
-- Bridgestone (бренд)
--- Turanza T005 (модель)
- Зимние
-- Бренд
--- Модель
- Всесезонные
-- .....
--- .....
Товары привязаны к самой последней категории (Turanza T005 и т.д.).
Есть необходимость получить массив названий брендов с доп. условием - в любой дочерней категории (она же модель) должна находиться хотя бы одна запись (товар).
На данный момент реализовал получение массива брендов как одного уровня дочерних по отношению к сезонам категорий:
function theme_get_cats_by_parent( $parent_ids = array() ) {
	
	if ( empty( $parent_ids ) ) return '$parent_ids is empty!';
	
	global $wpdb;

	$in_holders = implode( ',', array_fill( 0, count( $parent_ids ), '%d' ) );
	
	$term_names = $wpdb->get_col( $wpdb->prepare( "
		SELECT DISTINCT t.name
		FROM $wpdb->terms t
		INNER JOIN $wpdb->term_taxonomy tt
				   on t.term_id = tt.term_id
		WHERE tt.taxonomy = %s
		AND tt.parent IN ( $in_holders )
		ORDER BY t.name
	", [ 'product_cat', ...$parent_ids ] ) );
	
	return $term_names;
}

$brands = theme_get_cats_by_parent( array( 195, 196, 197 ) );

Уважаемые специалисты, подскажите, пожалуйста, как нужно модифицировать запрос, чтобы в результирующем массиве не было пустых категорий?
примечание: использование SQL запроса обусловлено большим количеством категорий - около 4К
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@Refguser
Решения для бизнеса: от создания ИМ до...
подскажите, пожалуйста, как нужно модифицировать запрос

Этот огород не нужен - есть же get_terms() иже с ним.

А по хорошему сайт надо переделывать - структура данных сплошная каша.
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Модельное решение:

SELECT brand.b_id
FROM brand
NATURAL LEFT JOIN model 
NATURAL LEFT JOIN item
GROUP BY 1
HAVING NOT SUM(i_id IS NULL)


fiddle
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы