• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/mysql/iblockelement.php
  • Класс: CIBlockElement
  • Вызов: CIBlockElement::GetList
static function GetList($arOrder=array("SORT"=>"ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
{
	global $DB;

	$el = new CIBlockElement();
	$el->prepareSql($arSelectFields, $arFilter, $arGroupBy, $arOrder);

	if($el->bOnlyCount)
	{
		$res = $DB->Query("
			SELECT ".$el->sSelect."
			FROM ".$el->sFrom."
			WHERE 1=1 ".$el->sWhere."
			".$el->sGroupBy."
		");
		$res = $res->Fetch();
		return $res["CNT"];
	}

	if(!empty($arNavStartParams) && is_array($arNavStartParams))
	{
		$nTopCount = (isset($arNavStartParams["nTopCount"]) ? (int)$arNavStartParams["nTopCount"] : 0);
		$nElementID = (isset($arNavStartParams["nElementID"]) ? (int)$arNavStartParams["nElementID"] : 0);

		if($nTopCount > 0)
		{
			$offset = (int)($arNavStartParams['nOffset'] ?? 0);
			$strSql = "
				SELECT ".$el->sSelect."
				FROM ".$el->sFrom."
				WHERE 1=1 ".$el->sWhere."
				".$el->sGroupBy."
				".$el->sOrderBy."
				LIMIT ".$nTopCount.
				($offset > 0
					? ' OFFSET ' . $offset
					: ''
				)."
			";
			$res = $DB->Query($strSql);
		}
		elseif(
			$nElementID > 0
			&& $el->sGroupBy == ""
			&& $el->sOrderBy != ""
			&& mb_strpos($el->sSelect, "BE.ID") !== false
			&& !$el->bCatalogSort
		)
		{
			$nPageSize = (isset($arNavStartParams["nPageSize"]) ? (int)$arNavStartParams["nPageSize"] : 0);

			if($nPageSize > 0)
			{
				$DB->Query("SET @ranx=0");
				$DB->Query("
					SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ @ranx:=el1.ranx
					FROM (
						SELECT @ranx:=@ranx+1 AS ranx, el0.*
						FROM (
							SELECT ".$el->sSelect."
							FROM ".$el->sFrom."
							WHERE 1=1 ".$el->sWhere."
							".$el->sGroupBy."
							".$el->sOrderBy."
							LIMIT 18446744073709551615
						) el0
					) el1
					WHERE el1.ID = ".$nElementID."
				");
				$DB->Query("SET @ranx2=0");

				$res = $DB->Query("
					SELECT *
					FROM (
						SELECT @ranx2:=@ranx2+1 AS `RANK`, el0.*
						FROM (
							SELECT ".$el->sSelect."
							FROM ".$el->sFrom."
							WHERE 1=1 ".$el->sWhere."
							".$el->sGroupBy."
							".$el->sOrderBy."
							LIMIT 18446744073709551615
						) el0
					) el1
					WHERE el1.`RANK` between @ranx-$nPageSize and @ranx+$nPageSize
				");
			}
			else
			{
				$DB->Query("SET @ranx=0");
				$res = $DB->Query("
					SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ el1.*
					FROM (
						SELECT @ranx:=@ranx+1 AS `RANK`, el0.*
						FROM (
							SELECT ".$el->sSelect."
							FROM ".$el->sFrom."
							WHERE 1=1 ".$el->sWhere."
							".$el->sGroupBy."
							".$el->sOrderBy."
							LIMIT 18446744073709551615
						) el0
					) el1
					WHERE el1.ID = ".$nElementID."
				");
			}
		}
		else
		{
			if ($el->sGroupBy == "")
			{
				$res_cnt = $DB->Query("
					SELECT COUNT(".($el->bDistinct? "DISTINCT BE.ID": "'x'").") as C
					FROM ".$el->sFrom."
					WHERE 1=1 ".$el->sWhere."
					".$el->sGroupBy."
				");
				$res_cnt = $res_cnt->Fetch();
				$cnt = $res_cnt["C"];
			}
			else
			{
				$res_cnt = $DB->Query("
					SELECT 'x'
					FROM ".$el->sFrom."
					WHERE 1=1 ".$el->sWhere."
					".$el->sGroupBy."
				");
				$cnt = $res_cnt->SelectedRowsCount();
			}

			$strSql = "
				SELECT ".$el->sSelect."
				FROM ".$el->sFrom."
				WHERE 1=1 ".$el->sWhere."
				".$el->sGroupBy."
				".$el->sOrderBy."
			";
			$res = new CDBResult();
			$res->NavQuery($strSql, $cnt, $arNavStartParams);
		}
	}
	else//if(is_array($arNavStartParams))
	{
		$strSql = "
			SELECT ".$el->sSelect."
			FROM ".$el->sFrom."
			WHERE 1=1 ".$el->sWhere."
			".$el->sGroupBy."
			".$el->sOrderBy."
		";
		$res = $DB->Query($strSql, false, "FILE: ".__FILE__."
LINE: ".__LINE__); } $res = new CIBlockResult($res); $res->SetIBlockTag($el->arFilterIBlocks); $res->arIBlockMultProps = $el->arIBlockMultProps; $res->arIBlockConvProps = $el->arIBlockConvProps; $res->arIBlockAllProps = $el->arIBlockAllProps; $res->arIBlockNumProps = $el->arIBlockNumProps; $res->arIBlockLongProps = $el->arIBlockLongProps; return $res; }