Ребята подскажите, возможно ли в bitrix (через его api запросы) описать следующую конструкцию:
SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC
SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC
|
Ребята подскажите, возможно ли в bitrix (через его api запросы) описать следующую конструкцию:
SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC |
|
|
|
|
|
Только если вот так:
«Да не могут же они!»
|
|||
|
|
|
|
Опишу задачу подробней. Сейчас у каждого товара есть статусы вида: Акция, Хит, Новинки. Статусы хранятся в свойствах (PROPERTY_).
Задача. Например у нас есть 100 товаров из которых 20 хиты. Запрос должен вернуть первые 20 товаров хиты, а остальные 80, допустим, отсортированные по наличию. |
|
|
|
|
Ваш пример вернул 3 элемента, а запрос вида: SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC, возвращает все елементы (пусть их будет 100 или 1000) и на первое место ставит 51, 20 и 30 |
|||||
|
|
|
Здесь вторая сортировка по имени, а не по наличию -- но, думаю, это не принципиально.
«Да не могут же они!»
|
|||||||
|
|
|
А мне нужно вначале только хиты, а потом хоть, даже если захочу, в рандомной сортировке. |
|||||
|
|
|
|
Либо я еще думал сделать 2 выборки и объединить их. Но тут сталкиваюсь с проблемой постраничной навигации
|
|
|
|
|
$arFilter['PROPERTY_PROD_STATUS'] = 123; // где 123 -- ID значения свойства
«Да не могут же они!»
|
|||
|
|
|
|
В таком случае я получу только хиты, а мне же нужно и остальные товары к ним добавить )
|
|
|
|
|
|
А, точно
1) Получаете ID элементов-хитов 2) Получаете ID элементов-не хитов 3) Складываете их в один массив и напускаете на него с постраничкой 4) Выбираете элементы с теми ID, которые вы получили после наложения постранички Это довольно гиморно, но реализуемо. Я делал.
«Да не могут же они!»
|
|||
|
|
|
|
1) Допустим получил айди хитов: 10, 20, 30
2) Не хитов: 5,6,7,8,9 3) Сложил и получил объект с айдишниками типа object(CDBResult) 4) На этом шаге, как я понимаю, мне приходиться делать выборку по полученным айди, верно? Получается любая сортировка опять будет влиять на них в целом |
|
|
|
|
|
См. пост #3 в этом треде.
«Да не могут же они!»
|
|
|
|
|
|
Так вот, смотрите, я свел задачу к тому, что у меня есть полностью готовый массив айдишников в нужном порядке. Сортировку статвлю в false, и все равно выборка перемешиваеться, не могу понять что на нее влияет
|
|
|
|
|
|
Следите за руками.
Допустим, у нас есть массив ID элементов:
Нам надо занести элементы в том же порядке в $arResult['ITEMS']. Заносим их ID как ключ массива:
Теперь делаем выборку:
И добавляем элементы в уже сформированный массив:
Сюрприз: элементы в $arResult['ITEMS'] идут в том порядке, в котором были заданы их ID в $arSomeID.
«Да не могут же они!»
|
|||||||||
|
|
|
|
Я уже так близок к истине. С сортировкой разобрался.
Теперь вывожу $arFilter перед выполнением CIBlockElement::GetList(false, $arrFilter, false, $arNavParams, $arSelect); в нем все четко, айди по порядку. А в результаты выполнения CIBlockElement::GetList айдишники, которые были хитами не попадают ))) Мистика |
|
|
|
|
|
ок, сейчас попробую с ключом...
|
|
|
|
|
«Да не могут же они!»
|
|||
|
|
|
|
Буммер. В том коде, который вы привели, вообще $arrFilter вместо $arFilter.
«Да не могут же они!»
|
|
|
|
|
|
Интересная штука получается,
первый массив из 5 элементов, это айди товаров с хитами дальше идет общий массив где хиты стоят в начале. $arFilter = array("ID" => "большой массив") $arSort = false; Запускаю CIBlockElement::GetList по вышеуказанным правилам и получаю интересную картину: То есть я таки получил первые десять элементов, согласно переданному фильтру айдишников, но первые 5 куда-то делись, мозг взрываеться ) |
|
|
|
|
|
|||
|
|
|
|
То есть я понимаю, что оно скорее их кинуло где-то в центр, так как отсортировало по айди. И Ваш метод с ключами тоже понял, просто если его использовать мне нужно запустить полную выборку, как я понимаю, что бы заполнить все $arResult['ITEMS'], а потом уже делить его на страницы
|
|
|
|
|
|
Такие большие объёмы данных тяжело отлаживать.
Для начала тупо сделайте так: $res = CIBlockElement::GetList(false, array('ID' => array(50428, 55783))); Убедитесь, что всё работает, после этого ищите ошибку.
«Да не могут же они!»
|
|
|
|
|
|
Ну в принципе как и предполагалось, при запросе
CIBlockElement::GetList(false, array('ID' => array(50428, 55783, 9665, 28196))); результат: То есть, выполняется автосортировка |
|
|
|
|
|
Ну, логично. Если не задать ORDER BY, муська их возвратит в том порядке, в котором найдёт (в данном случае -- от первого к последнему). Поэтому см. пост #15
«Да не могут же они!»
|
||||
|
|
|
|||