Доброго времени суток!
Хочу поделиться способом нахождения похожих по Тегам элементов ИБ. Способ будет полезен для вывода списка похожих статей в детальной странице статьи.
В коде происходит выборка 30 элементов, первыми из которых пойдут элементы у которых есть совпадения тегов "Personal" и "2020", далее хотя бы одного из этих двух Тегов, и в конце статьи, не имеющие совпадений.
По желанию можно добавить условие фильтра для выборки только тех элементов, которые содержат хоть один Тег. Например, условие по одному Тегу будет выглядеть так:
Пример запроса SQL:
В результате получим такие данные sql запроса:
Данные выборки через API
Надеюсь статья окажется полезной.
Хочу поделиться способом нахождения похожих по Тегам элементов ИБ. Способ будет полезен для вывода списка похожих статей в детальной странице статьи.
$obElements = \Bitrix\Iblock\ElementTable::getList([ 'order' => [ 'TAGS_COMPLIANCE_SORT'=>'DESC', "SHOW_COUNTER" => "DESC" ], "filter" => [ "=IBLOCK_ID" => 18, "=ACTIVE" => "Y" ], "sel ect" => [ "TAGS_COMPLIANCE_SORT", "NAME", "SORT", "SHOW_COUNTER" ], 'runtime' => [ new \Bitrix\Main\Entity\ExpressionField( 'TAGS_COMPLIANCE_SORT', "(case when LOCATE('Personal', TAGS)>0 then 1 else 0 end) + (case when LOCATE('2020', TAGS)>0 then 1 else 0 end)" ) ], "limit" => 30 ]); while ($arElement = $obElements->fetch()) { echo '<br><br><pre>' . __FILE__ . '<br>' . print_r($arElement, true) . '</pre>'; } |
По желанию можно добавить условие фильтра для выборки только тех элементов, которые содержат хоть один Тег. Например, условие по одному Тегу будет выглядеть так:
array( "LOGIC" => "OR", array( '%TAGS' => " ".$sTagName."," // строка целиком в середине ), array( 'TAGS' => $sTagName.",%" // строка целиком в начале ), array( 'TAGS' => "% ".$sTagName // строка целиком в конце ), array( 'TAGS' => $sTagName // единственная строка в тегах ) ) |
Пример запроса SQL:
select ((case when LOCATE('Personal', TAGS)>0 then 1 else 0 end) + (case when LOCATE('2020', TAGS)>0 then 1 else 0 end)) as SORT, TAGS, ID fr om b_iblock_element WHERE IBLOCK_ID=18 ORDER BY SORT DESC LIMIT 0, 30; |
В результате получим такие данные sql запроса:
Данные выборки через API
Надеюсь статья окажется полезной.