SELECT
apa.sale_type_id,
apa.status
FROM vt.applications a
JOIN orders o ON a.order_id = o.id
LEFT JOIN (
SELECT
apa.order_id,
apa.sale_type_id,
apa.status,
ROW_NUMBER() OVER (PARTITION BY apa.order_id, apa.sale_type_id ORDER BY apa.created_at DESC) AS rn
FROM cc.additional_projects_actions apa
) apa ON apa.order_id = a.order_id AND apa.sale_type_id = a.sale_type_id AND apa.rn = 1
WHERE
o.id = 64
AND a.sale_type_id IS NOT NULL
ORDER BY a.created_at DESC;
Выложите в вопросе: Структуру таблицы (CREATE TABLE), пример данных (INSERT INTO, 5-7 записей)
заданные критерии отбора и требуемый для всего этого результат
?|
, но только для чисел. Т.е в базе есть 10 записей, которые содержат ID 5 (внутри JSON), также 20, которые содержат ID 7 (внутри JSON). Передал array['7', '5'] - выбрались все 30 записей, передал array['7'] - только 20. Понятно, что в колонке, в JSON, может быть сразу два или больше ID, по которым мы ищем..where(function () {
if (filters.niches && filters.niches.ids.length) {
const niches = filters.niches.ids
this.whereRaw(`c.leads->'niches'->'ids' \\?| array[${niches.map(_ => '?').join(',')}]`, niches)
}
})
А не на пересечение с набором значений.
Возможное решение - разобрать JSON-массив на элементы, собрать в обычный массив и использовать для двух массивов оператор &&
[2024-01-17 18:09:07] [22P02] ERROR: malformed array literal: "ids"
[2024-01-17 18:09:07] Detail: Array value must start with "{" or dimension information.
{
"niches": {"ids": [13, 7], "inverted": false},
"statuses": {"ids": ["оплачено"], "inverted": false}
}
[2024-01-17 17:44:52] [42883] ERROR: operator does not exist: jsonb ?| integer[]
[2024-01-17 17:44:52] Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
Object.entries(dropMysteryBoxes.editable).map(([key, value]) => { ... }
Object.entries(dropMysteryBoxes.editable).sort().map(([key, value]) => { ... }
const onSave = useCallback(() => {
setPending(true);
setEdit(false);
API.update(dropMysteryBoxes.editable)
.then(({ data }) => {
setDropMysteryBoxes({
editable: data,
saved: data,
});
})
.catch(onError)
.finally(() => setPending(false));
}, [dropMysteryBoxes]);
Смотреть, как у вас заполняется dropMysteryBoxes.editable[somekey]. value . Может вам их бэк не в том порядке возвращает?
Вообще, в объектах не гарантированный порядок ключей, возможно придётся добавить сортировку после Object.entries