@itemashabanov

Как через GetList() выбрать такие элементы, которые удовлетворяют одновременно всем фильтрам?

Привет. Есть массив $search типа ["ошибки", "х23", "280", "пт3009"], нужно выбрать такие элементы, в которых существуют одновременно все эти искомые значения. Таким образом array("=PROPERTY_TAGS" => $search) выбираются все элементы, в которых хотя бы один из искомых значений есть. Возможно ли такое средствами GetList(). Я так понимаю сложная логика LOGIC => AND это не то?! Пробовал делать так:
[
		["LOGIC" => "AND"],
		["PROPERTY_TAGS" => "ошибки"],
		["PROPERTY_TAGS" => "х23"],
		["PROPERTY_TAGS" => "280"],
		["PROPERTY_TAGS" => "пт3009"],
	]
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
@itemashabanov Автор вопроса
foreach($search as $s) {
	$arSearch[] = array("ID" => CIBlockElement::SubQuery("ID", array("IBLOCK_ID" => 118, "PROPERTY_TAGS" => $s)));
}
$arSearch["PROPERTY_MODELS_AND_PROD_ID"] = $arResult["MODEL_OR_PROD"];
$GLOBALS['tagsFilter'] = $arSearch;


UPDATED:
Все-таки, такой способ некорректно работает: если передать в массив несколько существующих тегов, а после добавить парочку тегов, которых нет в этих элементах - БД начинает безбожно тупить.
Для такой задачи лучше использовать следующее:
$query = "SELECT IBLOCK_ELEMENT_ID, count(VALUE) cnt from b_iblock_element_prop_m118 where IBLOCK_PROPERTY_ID='2510' AND VALUE in ('".implode("','",$search)."') group by IBLOCK_ELEMENT_ID having cnt=".count($search);
$result = $DB->Query($query);
while($arElement = $result->GetNext()) {
	$arSearch[] = $arElement['IBLOCK_ELEMENT_ID'];
}

В b_iblock_element_prop_m118 118 - ID инфоблока, в IBLOCK_PROPERTY_ID='2510' 2510 - ID искомого свойства.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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