Задача: Получить топ продаж за последнюю неделю из 21 инфоблока
Глазами sql можно получить по сути одним запросом
1)нам нужно получить: количество, ид товара 2)нам нужно отфильтровать: по ИД инфоблока, по дате изменения 3)нам нужно отсортировать: количество по убыванию
Казалось бы делов не много... CSaleBasket::GetList с группировкой...окау подумал я и запилил.
Группировка работает, а вот сортировка фиг, сортирует всеравно по PRODUCT_ID
Что мы получим? нужно дернуть товары, нужно по ним пробежаться, получить их Инфоблок, проверить нужен ли нам этот товар, и потом отсортировать итоговый массив...Problem? да всего то 30+строк кода...мда
а вот скуль
SEL ECT DISTINCT COUNT('B.PRODUCT_ID') AS CNT, B.PRODUCT_ID,EL.IBLOCK_ID,EL.NAME
FR OM b_sale_basket B
LEFT JOIN b_iblock_element EL ON(EL.ID=B.PRODUCT_ID)
WHERE EL.IBLOCK_ID=21
GROUP BY B.PRODUCT_ID
ORDER BY CNT DESC
К чему это я все?
Допилите пожалуйста сортировку и фильтр в CSaleBasket::GetList(); НО вспоминаются строки из документации "корзина не связана с каталогом=>не связана с инфоблоками" но ведь когда кладется товар, записывается же его PRODUCT_ID и XML_ID, название,цена, которые берутся из нужных нам модулей...
не дописал. Когда то я эти поля использовал для интеграции с внешней системой реально связывал два каталога из разных по структуре систем в единый ИМ на Битрикс
Жуков Евгений, почему не верный? я же считаю количество PRODUCT_ID(т.е. сколько человек добавили его в корзину) не производя никаких больше действий. Хотя надо бы еще да, суммировать количество этих товаров.
При наличии GROUP BY ВСЕ поля, возвращаемые в select, должны быть в группировке. Иначе возвращаемый результат не валиден. По ссылке подробно разобрана работа БД в случае таких запросов.
Жуков Евгений, вы про "EL.IBLOCK_ID,EL.NAME" в селекте? тогда понятно. Но если их группировать именно по полю "NAME" то количество же будет не валидное т.к. Если вчера товар был "шарф красной" а сегодня "шарф красный". Вообще эти 2 поля добавлял для себя, чтоб проверить что запрос рабочий.
SEL ECT COUNT('B.PRODUCT_ID') AS CNT, B.PRODUCT_ID
FR OM b_sale_basket B
LEFT JOIN b_iblock_element O ON(O.ID=B.PRODUCT_ID)
WHERE O.IBLOCK_ID=21 AND B.ORDER_ID is not null
GROUP BY B.PRODUCT_ID
ORDER BY CNT DESC
kopoBko, ну хотелка то допилить поддержку А так выходит и допиливать нечего, так как используя апи можно решить задачу, пусть и с новым объектным ядром (хотя и тут с какой стороны смотреть, функционал то потиху перезжает на d7).
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».