Ребята подскажите, возможно ли в 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
15.03.2013 15:36:08
Ребята подскажите, возможно ли в bitrix (через его api запросы) описать следующую конструкцию:
SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC |
|
|
|
15.03.2013 16:55:22
Только если вот так:
«Да не могут же они!»
|
|||
|
|
15.03.2013 17:17:01
Опишу задачу подробней. Сейчас у каждого товара есть статусы вида: Акция, Хит, Новинки. Статусы хранятся в свойствах (PROPERTY_).
Задача. Например у нас есть 100 товаров из которых 20 хиты. Запрос должен вернуть первые 20 товаров хиты, а остальные 80, допустим, отсортированные по наличию. |
|
|
|
15.03.2013 17:25:35
Ваш пример вернул 3 элемента, а запрос вида: SELECT id FROM b_iblock_element ORDER BY id IN (51,20,30) DESC, возвращает все елементы (пусть их будет 100 или 1000) и на первое место ставит 51, 20 и 30 |
|||||
|
|
15.03.2013 18:41:39
Здесь вторая сортировка по имени, а не по наличию -- но, думаю, это не принципиально.
«Да не могут же они!»
|
|||||||
|
|
15.03.2013 18:53:59
А мне нужно вначале только хиты, а потом хоть, даже если захочу, в рандомной сортировке. |
|||||
|
|
15.03.2013 18:57:11
Либо я еще думал сделать 2 выборки и объединить их. Но тут сталкиваюсь с проблемой постраничной навигации
|
|
|
|
15.03.2013 18:58:30
$arFilter['PROPERTY_PROD_STATUS'] = 123; // где 123 -- ID значения свойства
«Да не могут же они!»
|
|||
|
|
15.03.2013 19:01:17
В таком случае я получу только хиты, а мне же нужно и остальные товары к ним добавить )
|
|
|
|
15.03.2013 19:14:18
А, точно
1) Получаете ID элементов-хитов 2) Получаете ID элементов-не хитов 3) Складываете их в один массив и напускаете на него 4) Выбираете элементы с теми ID, которые вы получили после наложения постранички Это довольно гиморно, но реализуемо. Я делал.
«Да не могут же они!»
|
|||
|
|
15.03.2013 20:01:09
1) Допустим получил айди хитов: 10, 20, 30
2) Не хитов: 5,6,7,8,9 3) Сложил и получил объект с айдишниками типа object(CDBResult) 4) На этом шаге, как я понимаю, мне приходиться делать выборку по полученным айди, верно? Получается любая сортировка опять будет влиять на них в целом |
|
|
|
15.03.2013 20:15:55
См. пост #3 в этом треде.
«Да не могут же они!»
|
|
|
|
15.03.2013 20:20:02
Так вот, смотрите, я свел задачу к тому, что у меня есть полностью готовый массив айдишников в нужном порядке. Сортировку статвлю в false, и все равно выборка перемешиваеться, не могу понять что на нее влияет
|
|
|
|
15.03.2013 20:48:34
Следите за руками.
Допустим, у нас есть массив ID элементов:
Нам надо занести элементы в том же порядке в $arResult['ITEMS']. Заносим их ID как ключ массива:
Теперь делаем выборку:
И добавляем элементы в уже сформированный массив:
Сюрприз: элементы в $arResult['ITEMS'] идут в том порядке, в котором были заданы их ID в $arSomeID.
«Да не могут же они!»
|
|||||||||
|
|
15.03.2013 20:48:43
Я уже так близок к истине. С сортировкой разобрался.
Теперь вывожу $arFilter перед выполнением CIBlockElement::GetList(false, $arrFilter, false, $arNavParams, $arSelect); в нем все четко, айди по порядку. А в результаты выполнения CIBlockElement::GetList айдишники, которые были хитами не попадают ))) Мистика |
|
|
|
15.03.2013 20:49:51
ок, сейчас попробую с ключом...
|
|
|
|
15.03.2013 20:57:56
«Да не могут же они!»
|
|||
|
|
15.03.2013 20:58:58
Буммер. В том коде, который вы привели, вообще $arrFilter вместо $arFilter.
«Да не могут же они!»
|
|
|
|
15.03.2013 21:06:54
Интересная штука получается,
первый массив из 5 элементов, это айди товаров с хитами дальше идет общий массив где хиты стоят в начале. $arFilter = array("ID" => "большой массив") $arSort = false; Запускаю CIBlockElement::GetList по вышеуказанным правилам и получаю интересную картину: То есть я таки получил первые десять элементов, согласно переданному фильтру айдишников, но первые 5 куда-то делись, мозг взрываеться ) |
|
|
|
15.03.2013 21:08:42
|
|||
|
|
15.03.2013 21:20:17
То есть я понимаю, что оно скорее их кинуло где-то в центр, так как отсортировало по айди. И Ваш метод с ключами тоже понял, просто если его использовать мне нужно запустить полную выборку, как я понимаю, что бы заполнить все $arResult['ITEMS'], а потом уже делить его на страницы
|
|
|
|
15.03.2013 21:20:19
Такие большие объёмы данных тяжело отлаживать.
Для начала тупо сделайте так: $res = CIBlockElement::GetList(false, array('ID' => array(50428, 55783))); Убедитесь, что всё работает, после этого ищите ошибку.
«Да не могут же они!»
|
|
|
|
15.03.2013 21:28:32
Ну в принципе как и предполагалось, при запросе
CIBlockElement::GetList(false, array('ID' => array(50428, 55783, 9665, 28196))); результат: То есть, выполняется автосортировка |
|
|
|
15.03.2013 21:35:49
Ну, логично. Если не задать ORDER BY, муська их возвратит в том порядке, в котором найдёт (в данном случае -- от первого к последнему). Поэтому см. пост #15
«Да не могут же они!»
|
||||
|
|
|||